MySQL 事务解析

article/2025/6/21 2:59:40

1. 事务简介

事务(Transaction) 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

经典案例:转账场景
以张三给李四转账 1000 元为例,正常流程需包含三步:

  1. 检查张三账户余额
  2. 张三账户扣除 1000 元
  3. 李四账户增加 1000 元

正常情况: 转账这个操作, 需要分为以下这么三步来完成 , 三步完成之后, 张三减少1000, 而李四增加1000, 转账成功 :

异常情况: 转账这个操作, 也是分为以下这么三步来完成 , 在执行第三步是报错了, 这样就导致张三减少1000块钱, 而李四的金额没变, 这样就造成了数据的不一致, 就出现问题了

为了解决上述的问题,就需要通过数据的事务来完成,我们只需要在业务逻辑执行之前开启事务,执行完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态

注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。

2. 事务操作

2.1 事务控制方式

方式一:修改全局提交模式(手动提交)

-- 查看事务提交模式(1为自动提交,0为手动提交)
SELECT @@autocommit;  
-- 设置为手动提交模式
SET @@autocommit = 0;  -- 提交事务(手动确认所有操作生效)
COMMIT;  
-- 回滚事务(撤销所有未提交操作)
ROLLBACK;  

注意:修改全局模式后,所有 DML 语句需手动提交,否则不会生效。

方式二:单次事务控制(推荐使用)

-- 开启事务
START TRANSACTION;  -- 或 BEGIN;-- 业务操作(以转账为例)
SELECT * FROM account WHERE name = '张三';  -- 查询余额
UPDATE account SET money = money - 1000 WHERE name = '张三';  -- 扣款
UPDATE account SET money = money + 1000 WHERE name = '李四';  -- 入账-- 根据执行结果决定提交或回滚
COMMIT;  -- 成功时提交
ROLLBACK;  -- 失败时回滚

3. 事务四大特性(ACID)

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

上述就是事务的四大特性,简称ACID。

4. 并发事务的三大问题

4.1 脏读(Dirty Read)

问题:一个事务读到另外一个事务还没有提交的数据

此时有两个事务,一个事务A,一个事务B,首先事务A去数据库查询id为1的这条数据,然后执行了update修改了id为1的这个数据,但是此时事务A还没有提交事务,然后事务B去查询id为1的数据的时候,却查询到了事务A修改后的数据,这种情况就称为脏读。

4.2 不可重复读(Non-repeatable Read)

问题:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读

此时有两个事务,一个事务A,一个事务B,事务A先查询id为1的数据,然后事务B修改了id为1的数据,等到事务A再次去查询id为1的数据的时候,此时读取到的是事务B修改后的数据,这个时候,在事务A中,两次查询的操作,查询的数据不一致,此时就出现了不可重复度的问题。

4.3 幻读(Phantom Read)

问题:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据 已经存在,好像出现了 "幻影"

此时有两个事务,一个事务A,一个事务B,事务A先去查询id为1的数据,查询到的结果为空,然后事务B插入id为1的数据,然后等到事务A去插入id为1的数据的时候,就报错了,说主键冲突,然后事务A在去查询id为1的数据,但是查询到的结果还是空,此时就发生了,幻读的问题。

5. 事务隔离级别

为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:

隔离级别脏读不可重复读幻读性能影响
Read Uncommitted(读未提交)最高
Read Committed(读已提交)×较高
Repeatable Read(可重复读,MySQL 默认)××中等
Serializable(串行化)×××最低
-- 查看当前事务隔离级别
SELECT @@TRANSACTION_ISOLATION;-- 设置隔离级别(SESSION为当前会话,GLOBAL为全局)
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE};

注意:事务隔离级别越高,数据越安全,但是性能越低。其中Mysql中默认的事物隔离级别时可重复度,隔离级别需要根据实际的情况选择。


http://www.hkcw.cn/article/tkbrkydufB.shtml

相关文章

【Qt】Bug:findChildren找不到控件

使用正确的父对象调用 findChildren:不要在布局对象上调用 findChildren,而应该在布局所在的窗口或控件上调用。

Protos-SIP:经典 SIP 协议模糊测试工具!全参数详细教程!Kali Linux教程!

简介 该测试套件的目的是评估会话发起协议 (SIP) 实现的实现级别安全性和稳健性。 Protos-SIP 是一款专为 SIP 协议模糊测试(Fuzzing)设计的工具,最初由 OUSPG(Oulu University Secure Programming Group)开发&#…

springMVC-9数据格式化

数据格式化 学习目标: 理解在我们提交数据(比如表单时),SpringMVC怎样对提交的数据进行转换和处理的 Spring MVC 上下文中内建了很多转换器,可完成大多数 Java 类型的转换工作。 基本数据类型可以和字符串之间自动完成转换 应用实例-页面…

【多线程初阶】死锁的产生 如何避免死锁

文章目录 关于死锁一.死锁的三种情况1.一个线程,一把锁,连续多次加锁2.两个线程,两把锁3.N个线程,M把锁 --哲学家就餐问题 二.如何避免死锁死锁是如何构成的(四个必要条件)打破死锁 三.死锁小结 关于死锁 一.死锁的三种情况 1.一个线程,一把锁,连续多次加锁 -->由synchroni…

第3节 Node.js 创建第一个应用

Node.js 非常强大,只需动手写几行代码就可以构建出整个HTTP服务器。事实上,我们的Web应用以及对应的Web服务器基本上是一样的。 在我们创建Node.js第一个"Hello, World!"应用前,让我们先了解下Node.js应用是由哪几部分组成的&…

余承东:ADS 4今年Q4实现高速L3商用,展望2026年L4

2025(第三届)未来汽车先行者大会于5月31日至6月1日在深圳国际会展中心(宝安)举行,华为常务董事、终端BG董事长余承东在会上发表了演讲。余承东在演讲中提到ADS的进展和展望。他表示,尊界S800首发搭载了ADS 4,并预计从2025年第三季度开始,尊界S800等车型将升级到ADS 4。…

Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】

前言: 在上篇博客中,我们探讨了单机模式下如何通过悲观锁(synchronized)实现"一人一单"功能。然而,在分布式系统或集群环境下,单纯依赖JVM级别的锁机制会出现线程并发安全问题,因为这…

【本周开启】Springer |第七届区块链、人工智能和可信系统国际会议(BlockSys‘2025)

Springer |第七届区块链、人工智能和可信系统国际会议(BlockSys2025) International Conference on Blockchain, Artificial Intelligence, and Trustworthy Systems 中国 珠海 2025年05月30日-2025年05月31日 大会官网:BlockSys2025 – Int…

PCIE硬件管脚顺序问题解决方案

当你的硬件设计的管脚顺序不对,或者tx/rx的顺序搞反了,您发现你在自己工程的XDC中对管脚进行分配,布线通不过,或者布过去了,上位机不能识别,这个是由于综合工具默认是就近原则,使用自定义生成的…

生成https 证书步骤

一、OpenSSL下载 OpenSSL下载地址: https://slproweb.com/products/Win32OpenSSL.html 如果电脑是64位的就选择64位的 二、OpenSSL安装 双击打开.exe文件 开始安装,一直下一步,不过需要注意的是默认安装路径是C盘,可更改到其他盘…

Baklib内容中台革新企业知识实践

Baklib智能知识中枢构建 作为现代企业知识管理的核心架构,Baklib内容中台通过整合多源异构数据形成智能化知识中枢,实现从信息采集到价值转化的全链路管理。其底层采用跨平台数据贯通技术,支持API接口与企业现有CRM、ERP系统无缝对接&#x…

第六十三节:深度学习-模型推理与后处理

深度学习模型训练完成后,如何高效地将其部署到实际应用中并进行准确预测?这正是模型推理与后处理的核心任务。OpenCV 的 dnn 模块为此提供了强大支持,本文将深入探讨 OpenCV 在深度学习模型推理与后处理中的关键技术与实践。 第一部分:基础概念与环境搭建 1.1 核心概念解析…

【CF】Day71——⭐Codeforces Round 892 (Div. 2) D (二分 + 思维 + 差分模拟区间合并)

D. Andrey and Escape from Capygrad 题目: 思路: 很有思维的一题,非常nice 题目给了我们一个很有意思的条件,如果 x 在 l[i] ~ r[i] 之间,那么就可以跳跃到 a[i] ~ b[i] 之间,那么一个很显然的想法&#…

C#集合循环删除某些行

你想要在遍历集合(例如List)的同时删除某些元素时,直接在循环中删除元素可能会导致问题,因为这可能会改变集合的大小和导致索引问题; 可以用for循环的倒序来删除; 如果要删除满足特定条件的所有元素&…

fpga系列 HDL : FPGA实现奇数倍分频

偶分频 //240个时钟周期翻转一次输出&#xff0c;这实际上是一个 480倍分频器 reg [7:0] counter 0; reg divided_clk 1b0; always (posedge clk) beginif (counter 239) begin // 240counter < 0;divided_clk < ~divided_clk; end else begincounter < counter 1…

ICML 2025 Spotlight | 机器人界的「Sora」!让机器人实时进行未来预测和动作执行!

标题&#xff1a;Video Prediction Policy: A Generalist Robot Policy with Predictive Visual Representations 作者&#xff1a;Yucheng Hu, Yanjiang Guo, Pengchao Wang, Xiaoyu Chen, Yen-Jen Wang, Jianke Zhang, Koushil Sreenath, Chaochao Lu, Jianyu Chen 机构&am…

「 扑翼飞行器 」悬停飞行的信号串联滤波器设计

一、前言 小白在设计扑翼飞行器悬停算法过程中,设计了三种滤波器串联使用,总结如下。 二、正文 陷波滤波器 (Notch @30 Hz) 目的:针对扑翼机构或传感系统中常见的机械谐振或结构共振噪声进行有源抑制。 工作原理:在归一化频率 (假设采样率 , HZ)处设计一个陷波(notch)…

RL 基础 (待补充)

注&#xff1a;本文仅用于自学习笔记备忘&#xff0c;不做任何分享和商业用途。 主要参考资料&#xff1a; 蘑菇书EasyRLA (Long) Peek into Reinforcement Learning | LilLog 第1章 强化学习基础 RL算法分类&#xff1a; Model-based: Rely on the model of the environm…

Redis7底层数据结构解析

redisObject 在 Redis 的源码中&#xff0c;Redis 会将底层数据结构&#xff08;如 SDS、hash table、skiplist 等&#xff09;统一封装成一个对象&#xff0c;这个对象叫做 redisObject&#xff0c;也简称 robj。 typedef struct redisObject {unsigned type : 4; // 数…

Kafka 的 ISR 机制深度解析:保障数据可靠性的核心防线

在 Kafka 的消息处理体系中&#xff0c;数据的可靠性和高可用性是至关重要的目标。而 ISR&#xff08;In-Sync Replicas&#xff0c;同步副本&#xff09;机制作为 Kafka 实现这一目标的关键技术&#xff0c;在消息复制、故障容错等方面发挥着核心作用。接下来&#xff0c;我们…