MySQL-事务(TRANSACTION-ACID)管理

目录

一、什么是事务?

1.1.事务的定义

1.2.事务的基本语句

1.3.事务的四大特性(ACID)

二、数据库的并发控制

2.1.什么是并发及并发操作带来的影响?

2.2.并发操作带来的隔离级别

三、使用事务的场景

3.1.银行转账场景示例

3.2.模拟丢失修改、不可重复读、读脏数据

一、什么是事务?

1.1.事务的定义

MySQL事务是数据库操作的一个基本单元,它确保一组操作要么全部成功,要么全部失败。事务的主要目的是保证数据的一致性和完整性。

1.2.事务的基本语句

一个事务由应用程序的一组操作序列组成,它以 BEGIN TRANSACTION语句开始,以 END TRANSACTION 结束语句。

事务定义的语句如下:

  1. BEGIN TRANSACTION: 事务开始。
  2. END TRANSACTION:事务结束。
  3. COMMIT:事务提交。该操作表示事务成功地结束,它将通知事务管理器该事务的所有更新操作现在可以被提交或永久地保留。
  4. ROLLBACK:事务回滚。该操作表示事务非成功地结束,它将通知事务管理器出故障了,数据库可能处于不一致状态,该事务的所有更新操作必须回滚或撤销。这意味着将撤销该事务对数据库的更新。这样,数据库恢复到该事务执行第一条语句之前的状态。

典型示例:

典型的例子是银行转账业务。对“从账户 A 转入账户 B 金额x元”业务,站在顾客角度来看,转账是一次单独操作;而站在数据库系统的角度它至少是由两个操作组成的,第一步从账户A减去x元,第二步给账户B加上x元。下面是银行转账事务的伪代码:

BEGIN TRANSACTION
        read(A);                        /*读账户A的余额*/
        A=A-x;
        IF(A<0)THEN
                 print("金额不足,不能转账");

                ROLLBACK;        /*撤销该事务,回到事务执行前的状态*
        ELSE
                write(A);                /*写入账户A的余额*/
                read(B);
                B=B+1;
                write(B);
                COMMIT;                /*提交事务*/
        ENDIF;
END TRANSACTION

1.3.事务的四大特性(ACID)

  1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。如果事务中的任何操作失败,整个事务将回滚到初始状态。
  2. 一致性(Consistency):事务执行前后,数据库的状态必须保持一致。这意味着事务必须遵循数据库的约束和规则。
  3. 隔离性(Isolation):多个事务并发执行时,一个事务的操作不会影响其他事务。每个事务都感觉不到其他事务的存在。
  4. 持久性(Durability):一旦事务提交,它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。

二、数据库的并发控制

2.1.什么是并发及并发操作带来的影响?

所谓并发操作,是指在多用户共享的系统中,许多用户可能同时对同一数据进行操作。这种机制就有可能导致,其他用户想要得到原始数据,但由于其他用户的读写操作,导致数据已经进行修改等情况的产生。

通常并发操作导致数据的不一致性主要有三类:

1.丢失修改:
        如图 12-7(a)所示,事务 T!、T,都是对數据 A 做減1操作。事务T,在时劍ち把A 修改后的值15写入数据库,但事务T在时刻t再把它对A减1后的值15写入。两个事务都是对 A的值进行减1操作并且都执行成功,但A中的值却只减了1。现实的例子如售票系统,同时售出了两张票,但数据库里的存票却只减了一张,造成数据的不一致。原因在于T事务对数据库的修改被 T事务覆盖而丢失了,破坏了事务的隔离性。

2.不可重复读:

        如图 12-7(b)所示,事务 T读取 A、B 的值后进行运算,事务 T在 t时刻对 B的值做了修改以后,事务 T又重新读取 A、B 的值再运算,同一事务内对同一组数据的相同运算结果不同,显然与事实不相符。同样是事务 工干扰了事务 T的独立性。

3.读脏数据:

        如图 12-7(c)所示,事务 T对数据 ℃ 修改之后,在 t时刻事务 T读取修改后的 ℃ 值做处理,之后事务 T回滚,数据 ℃ 恢复了原来的值,事务 T对C所做的处理是无效的,它读的是被丢掉的垃圾值。

其主要原因是事务的并发操作破坏了事务的隔离性。DBMS的并发控制子系统负责协调并发事务的执行,保证数据库的完整性不受破坏,避免用户得到不正确的数据。

2.2.并发操作带来的隔离级别

并发操作对应产生了由于不同隔离级别所产生的不同并发问题。一般规律也是:隔离级别越高,数据一致性越强,但并发性能相应就越低。

并发问题读未提交(Read Uncommitted)读已提交(Read committed)可重复读(Repeatable Read)串行化(Serializable)
脏读(Dirty Read)×
不可重复读××

幻读(Phantom)

××MySQL在可重复读级别通过Next-Key锁解决幻读
丢失更新××不能完全解决

幻读和不可重复读:

类型关注点变化
不可重复读同一条记录的数据变化余额从 1000 → 900(值变化)
幻读结果集的行数变化第一次查有 5 条,第二次变 6 条。

三、使用事务的场景

3.1.银行转账场景示例

测试事务的一致性(要么同时成功,要么同时失败)

-- 表结构设计
drop table book;
CREATE TABLE `book` (`recID` INT(11) PRIMARY KEY AUTO_INCREMENT,`title` VARCHAR(50) NOT NULL,`type` VARCHAR(20) NOT NULL,`price` DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;show TABLES;select * from book b;
-- 初始数据
INSERT INTO `book` (`title`, `type`, `price`) VALUES
('Java Programming', 'Computer', 16.00),
('Java EE Technology', 'Computer', 5.00),
('Information System', 'Computer', 15.00);-- 事务操作语句
BEGIN;
-- 批量降价8元
UPDATE book SET price = price - 8 WHERE recID = 1;
UPDATE book SET price = price - 8 WHERE recID = 2;
UPDATE book SET price = price - 8 WHERE recID = 3;-- 验证价格是否不低于0
SELECT * FROM book WHERE price < 0;-- 根据验证结果选择提交或回滚
COMMIT; -- 无负值时提交
ROLLBACK; -- 出现负值时回滚

验证:

验证价格是否不低于0,因为出现负值,我们执行回滚操作,看数据是否会回到我们最开始的状态值。

3.2.模拟丢失修改、不可重复读、读脏数据

由于mysql其自身的默认隔离级别就已经是可重复读,即使并发执行,也不会产生丢失修改和不可重复读问题。

-- 查看当前会话的隔离级别(MySQL 5.7+ 和 MariaDB)SELECT @@transaction_isolation;-- 查看全局隔离级别SELECT @@global.transaction_isolation;-- mysql中的默认隔离级别是:REPEATABLE-READ

模拟:

-- 1. 表结构设计(以银行账户为例)
CREATE TABLE account (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,balance DECIMAL(10, 2) NOT NULL  -- 账户余额
);
-- 插入初始数据:
INSERT INTO account (name, balance) VALUES ('Alice', 1000.00);-- 2. 模拟不可重复读
-- 现象:事务A多次读取同一数据,事务B修改并提交后,事务A两次读取结果不一致。
-- 隔离级别:READ COMMITTED(读已提交)
-- 操作步骤:-- 事务A(首次读取):
BEGIN;
SELECT balance FROM account WHERE name = 'Alice'; -- 结果:1000.00-- 事务B(修改并提交):
BEGIN;
UPDATE account SET balance = 900.00 WHERE name = 'Alice';
COMMIT; -- 修改生效-- 事务A(再次读取):
SELECT balance FROM account WHERE name = 'Alice'; -- 结果:900.00(与第一次不一致)
COMMIT;
-- 结果:事务A两次读取结果不同,即不可重复读。-- 3. 模拟丢失修改
-- 现象:两个事务同时读取并修改同一数据,后提交的事务覆盖前者的修改。
-- 隔离级别:READ UNCOMMITTED(读未提交)或 READ COMMITTED
-- 操作步骤:-- 事务A(读取并修改):
BEGIN;
SELECT balance FROM account WHERE name = 'Alice'; -- 读取1000.00
UPDATE account SET balance = 1000.00 - 100 = 900.00 WHERE name = 'Alice';-- 事务B(同时读取并修改):
BEGIN;
SELECT balance FROM account WHERE name = 'Alice'; -- 仍读取1000.00(未提交的数据)
UPDATE account SET balance = 1000.00 - 200 = 800.00 WHERE name = 'Alice';
COMMIT; -- 先提交-- 事务A提交:
COMMIT; -- 覆盖事务B的修改
-- 结果:余额变为 900.00(事务B的修改丢失),正确应为 700.00。

开启事务A B

事务A读取到的值

事务B修改提交之后:

事务A再次读取:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos系统docker配置milvus教程

本人使用的是京东云服务器配置milvus 参考教程&#xff1a;https://blog.csdn.net/withme977/article/details/137270087 首先确保安装了docker 、docker compose docker -- version docker-compose --version创建milvus工作目录 mkdir milvus # 进入到新建的目录 cd milvu…

什么是JSON ?从核心语法到编辑器

一、什么是JSON &#xff1f; JSON&#xff0c;即 JavaScript 对象表示法&#xff0c;是一种轻量级、跨语言、纯文本的数据交换格式 。它诞生于 JavaScript 生态&#xff0c;但如今已成为所有编程语言通用的 “数据普通话”—— 无论前端、后端&#xff0c;还是 Python、Java&…

计算机网络(7)——物理层

1.数据通信基础 1.1 物理层基本概念 物理层(Physical Layer)是所有网络通信的物理基础&#xff0c;它定义了在物理介质上传输原始比特流(0和1)所需的机械、电气、功能、过程和规程特性 1.2 数据通信系统模型 信源&#xff1a;生成原始数据的终端设备&#xff0c;常见形态包括…

深度学习基础知识总结

1.BatchNorm2d 加速收敛&#xff1a;Batch Normalization 可以使每层的输入保持较稳定的分布&#xff08;接近标准正态分布&#xff09;&#xff0c;减少梯度更新时的震荡问题&#xff0c;从而加快模型训练速度。 减轻过拟合&#xff1a;批归一化引入了轻微的正则化效果&#…

iOS 抖音首页头部滑动标签的实现

抖音首页的头部滑动标签(通常称为"Segmented Control"或"Tab Bar")是一个常见的UI组件&#xff0c;可以通过以下几种方式实现&#xff1a; 1. 使用UISegmentedControl 最简单的实现方式是使用系统自带的UISegmentedControl&#xff1a; let segmentedCo…

ThreadLocal实现原理

ThreadLocal 是 Java 中实现线程封闭&#xff08;Thread Confinement&#xff09;的核心机制&#xff0c;它通过为每个线程创建变量的独立副本来解决多线程环境下的线程安全问题。 Thread └── ThreadLocalMap (threadLocals) // 每个线程持有的专属Map├── Entry[] tab…

【笔记】结合 Conda任意创建和配置不同 Python 版本的双轨隔离的 Poetry 虚拟环境

如何结合 Conda 任意创建和配置不同 Python 版本的双轨隔离的Poetry 虚拟环境&#xff1f; 在 Python 开发中&#xff0c;为不同项目配置独立且适配的虚拟环境至关重要。结合 Conda 和 Poetry 工具&#xff0c;能高效创建不同 Python 版本的 Poetry 虚拟环境&#xff0c;接下来…

defineAsyncComponent

下面,我们来系统的梳理关于 defineAsyncComponent 懒加载 的基本知识点: 一、异步组件核心概念 1.1 什么是异步组件? 异步组件是 Vue 中一种按需加载组件的机制,允许将组件代码拆分为独立的 chunk,在需要时再从服务器加载。这种技术能显著提升应用初始加载速度。 1.2 为…

ANeko v1.0.3 | 在手机里养只宠物猫 实时互动 动画细腻

ANeko是一款专为喜欢猫咪的用户设计的互动养宠应用。它让你在手机屏幕上拥有一只可爱的猫咪动画&#xff0c;这只猫咪会实时跟随你的手指触摸轨迹&#xff0c;带来生动有趣的互动体验。该应用不仅保留了用户熟悉的交互式猫动画&#xff0c;还结合了现代高清图形技术&#xff0c…

人工智能AI

AI 简介 AI 使我们能够生成可以改进卫生保健的出色软件,让人能够克服生理上的不便,改进智能基础结构,创造令人惊叹的娱乐体验,甚至拯救地球! 什么是 AI? 简而言之,AI 就是一种模仿人类行为和能力的软件。 关键工作负载包括: 机器学习 - 它通常是 AI 系统的基础,也是…

Vue 中 data 选项:对象 vs 函数

Vue 中 data 选项&#xff1a;对象 vs 函数 在 Vue 开发中&#xff0c;data 选项可以使用对象或函数形式&#xff0c;了解它们的使用场景非常重要。下面我将通过一个直观的示例来展示两者的区别和适用场景。 <!DOCTYPE html> <html lang"zh-CN"> <h…

python打卡第49天

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 CBAM 注意力模块介绍 从 SE 到 CBAM&#xff1a;注意力机制的演进 之前我们介绍了 SE&#xff08;Squeeze-and-Excitation&#xff09;通道注意力模块&#xff0c;其本质是对特征进行增强处理。现在&#…

iOS和桌面双端抓包实战经验总结:Sniffmaster与常见工具组合解析

近几年&#xff0c;移动端和桌面端的网络调试工作变得越来越“棘手”。过去一个代理证书搞定的场景&#xff0c;现在常常被HTTPS加密、双向验证、App安全策略给难住。特别是涉及到iOS平台时&#xff0c;很多传统抓包方案都不再适用。作为一名在多个平台开发和测试的程序员&…

cloudstudio腾讯云:matplotlib 设置中文字体

检查可用字体&#xff1a; import matplotlib.font_manager as fm fonts [f.name for f in fm.fontManager.ttflist] print(fonts) # 查看系统中可用的字体列表# 列出所有中文字体文件 !fc-list :langzh没有中文字体&#xff0c;需要下载 !sudo apt-get install fonts-wqy-m…

Django中的ORM的使用步骤----以MySQL为例

1 以纯Python的形式创建项目虚拟环境 2 命令安装Django 3 在当前虚拟环境目录下命令创建Django项目 4 命令创建app 注&#xff1a; 若想将创建的子应用存放到指定目录&#xff0c;如app&#xff0c; 那么需要先手动创建app目录&#xff0c;再手动创建子应用目录&#xff0c;如o…

Rust 学习笔记:通过 Send 和 Sync trait 实现可扩展并发性

Rust 学习笔记&#xff1a;通过 Send 和 Sync trait 实现可扩展并发性 Rust 学习笔记&#xff1a;通过 Send 和 Sync trait 实现可扩展并发性Send trait&#xff1a;允许在线程之间转移所有权Sync trait&#xff1a;允许多线程访问手动实现 Send 和 Sync 是不安全的练习题 Rust…

【C++】第十一节—一文详解vector(使用+杨辉三角+深度剖析+模拟实现+细节详细补充)

Hi&#xff0c;我是云边有个稻草人&#xff0c;偶尔中二的C领域博主^(*&#xffe3;(oo)&#xffe3;)^&#xff0c;与你分享专业知识—— C_本篇博客所属专栏—持续更新中—欢迎订阅喔 目录 一、vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 &#xff08;1&…

华为智选携手IAM:突破技术边界,重塑智慧健康家居新时代

华为智选与IAM的联动创研&#xff0c;是科技与健康两大领域深度结合的推动者&#xff0c;更是健康智能家电创新的引领者。他们不再只是产品的制造商&#xff0c;而是生活方式的革新者——用创新科技重构健康生活&#xff0c;用智慧生态重塑家居体验。在这场深度的跨界融合中&am…

基于cornerstone3D的dicom影像浏览器 第三十一章 从PACS服务加载图像

文章目录 前言一、两个服务接口1. 查询检查接口2. 查询图像接口 二、查询界面组件三、修改归档总结 前言 "基于cornerstone3D的dicom影像浏览器"系列文章中都是加载本地文件夹的的dicom图像。 作为一个合格的dicom影像浏览器需要对接PACS服务端&#xff0c;从PACS服…

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…