MySQL事务原理、ACID特性与隔离级别详解及实操

山间有风
山间有风
发布时间:2026-10-16| 3人浏览过
原创

了解MySQL事务的原子性、一致性、隔离性与持久性原则,掌握四种事务隔离级别的差异及其在实际开发中的应用场景。

1、什么是数据库事务

一个事务是业务逻辑的最小工作单元,代表一组必须同时成功的操作。以银行账户转账为例:从A账户向B账户转账10,000元,涉及两条关键的DML语句:

UPDATE t_act SET balance = balance - 10000 WHERE actno = 'act-001';
UPDATE t_act SET balance = balance + 10000 WHERE actno = 'act-0021';

这两条语句必须具备“同步成功”或“同步失败”的特性。若其中一条执行而另一条报错,将导致数据不一致。为确保这种安全性,数据库引入了“事务机制”来锁定这些操作的逻辑边界。

2、事务适用的操作类型

事务仅作用于 INSERT、DELETE 和 UPDATE 这三种DML语句。这是因为只有这些操作会直接修改表中的实际数据内容。事务的存在旨在确保在执行多步数据变更时,数据库始终保持一种逻辑上的一致性状态。

3、为何单条DML不需要事务

如果一项业务仅仅执行一条DML语句,系统默认将其视为一个自动完成的事务单元。但在现实场景中,复杂的业务往往由多条相关的DML语句联合完成,此时显式地使用事务来控制这些语句的成败关系就至关重要了。

4、事务的运行原理

事务在内存中维护着操作日志。其核心逻辑如下:
当执行 COMMIT(提交)时,系统将暂存的操作记录持久化写入硬盘,随后清空历史日志。
当执行 ROLLBACK(回滚)时,系统将丢弃这些日志记录,不进行持久化,数据状态还原至操作前。
此外,高级应用中还支持使用保存点(Savepoint)来实现更细粒度的回滚控制。

5、事务的四大特性(ACID)

保证事务有效性的四个关键属性被称为ACID:

  • A (Atomicity) 原子性: 事务是最小的不可分割的执行单位,要么全部执行,要么一个也不执行。
  • C (Consistency) 一致性: 事务完成后,数据库必须从一个合法状态转换到另一个合法状态。例如两人转账,无论过程如何,两者金额总和在事务前后保持不变。
  • I (Isolation) 隔离性: 多个并发事务之间应当互不干扰,每个事务看不到其他中间状态的数据。
  • D (Durability) 持久性: 一旦事务提交,其对数据库数据的修改就是永久性的,即使发生系统故障也不会丢失。

6、事务隔离级别详解

为解决并发访问带来的数据冲突,SQL标准定义了四种隔离级别。级别越高,安全性越强,但并发性能越低。Oracle默认采用读已提交,而MySQL默认采用可重复读。

第1级:读未提交(Read Uncommitted)

允许读取尚未提交的数据。该级别会导致严重的“脏读”问题,即读到的是别人还没来得及提交(甚至最终会回滚)的错误数据。

第2级:读已提交(Read Committed)

只能读取已经提交了的数据。这解决了“脏读”,但在一次事务执行期间,如果其他事务修改并提交了数据,当前事务再次查询时会得到不同的结果,这在技术上称为“不可重复读”。

第3级:可重复读(Repeatable Read)

这是MySQL的默认级别。它确保在同一事务中多次读取同一条记录的结果是一致的。在该模式下,事务开启时看到的数据快照在整个事务生命周期内保持不变。即使其他事务已经提交了修改,当前事务也依然只能看到旧版本的备份数据(即所谓的“幻读/幻想”数据),从而保证了极高的数据稳定性。

第4级:序列化读/串行化(Serializable)

强制所有事务按顺序执行,彻底解决脏读、不可重复读和幻读问题。由于极大的限制了并发度,通常只用于对数据一致性要求极其严苛且并发量极低的特殊场景。

7、MySQL事务与隔离级别实操演示

第1步:掌握基础命令与关闭自动提交

MySQL默认开启“自动提交”模式,即每执行一条DML语句就会立即生效。为了手动控制事务边界,首先必须关闭此功能。

-- 手动启动一个事务(等同于关闭自动提交)
START TRANSACTION;

-- 提交当前事务操作
COMMIT;

-- 撤销自上次提交以来的所有操作
ROLLBACK;

第2步:配置全局事务隔离级别

通过以下命令可以调整全局的事务隔离等级。设置完毕后,建议退出当前会话并重新登录以使新参数生效。

-- 设置为第一级:读未提交
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- 设置为第二级:读已提交
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 设置为第三级:可重复读(MySQL默认值)
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 设置为第四级:串行化
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 查看当前全局事务隔离级别
SELECT @@global.tx_isolation;

第3步:演示“读未提交”(脏读)

首先在全局环境中将隔离级别设置为 read uncommitted。

接下来进行正式的业务逻辑演示:

第4步:演示“可重复读”(Snapshot机制)

首先将全局级别设置为 repeatable read。

接着演示窗口间的隔离效果:

在此级别下需要注意:当我们开启一个事务后,在当前窗口的 COMMIT 或 ROLLBACK 结束事务之前,任何来自其他会话的更新都不会影响当前窗口的视图。也就是说,当前窗口读取到的始终是开启事务那一刻的数据备份。这种现象常被误解为“读不到真实数据”,但实际上它是防止并发错误的最有效手段。

若要获取最新的真实数据,必须在当前窗口先结束旧的事务(执行 COMMIT 或 ROLLBACK),然后重新启动新的读取操作。

第5步:演示“串行化”(Serialization)

最后,配置最高级别的隔离模式 serializable。

正式演示并发时的排队等待情况:

观察左侧窗口的提交动作如何阻塞右侧窗口的后续读取:

以上就是MySQL数据库事务transaction示例讲解教程的详细内容,更多关于MySQL数据库事务transaction的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。