MySQL事务原理、ACID特性与隔离级别详解及实操
了解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的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









