MySQL 事务深度解析:ACID 特性与隔离级别实战
深入解析 MySQL 事务机制。首先阐述事务作为一组 DML 语句集合的原子性、一致性、隔离性和持久性(ACID)特征。接着说明 InnoDB 引擎对事务的支持及自动提交模式。详细对比四种事务隔离级别(读未提交、读提交、可重复读、串行化)及其解决的并发问题如脏读、幻读等。最后介绍多版本并发控制(MVCC)原理,包括回滚指针、快照仓库和读视图,解释如何实现读写无锁并发。旨在帮助开发者理解事务底层逻辑,保障数据一致性。

深入解析 MySQL 事务机制。首先阐述事务作为一组 DML 语句集合的原子性、一致性、隔离性和持久性(ACID)特征。接着说明 InnoDB 引擎对事务的支持及自动提交模式。详细对比四种事务隔离级别(读未提交、读提交、可重复读、串行化)及其解决的并发问题如脏读、幻读等。最后介绍多版本并发控制(MVCC)原理,包括回滚指针、快照仓库和读视图,解释如何实现读写无锁并发。旨在帮助开发者理解事务底层逻辑,保障数据一致性。

事务是一组 DML 相关的语句(操作指令)集合,这些指令要么成功/不成功,满足如下性质:
- 原子性(Atomicity):操作不可分割,要么全成要么全败。
- 一致性(Consistency):事务前后数据库完整性不被破坏。
- 隔离性(Isolation):并发事务互不干扰,避免脏读、幻读等问题。
- 持久性(Durability):事务提交后,数据修改永久有效。
事务是为了服务应用层而存在。数据库是存储数据的地方,应用层对数据进行的操作必须保障数据的一致性。这些关注点(如修改数据是否成功、数据是否会丢失)应交给 MySQL 实现,因此它是一个服务机制。
在 MySQL 中只有使用了 InnoDB 数据库引擎的数据库或表才支持事务,MyISAM 不支持。
mysql> show engines; -- 表格显示
mysql> show engines \G -- 行显示
事务的提交方式常见的有两种:自动提交和手动提交。
查看事务提交方式:
show variables like 'autocommit';
用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0; -- 禁止自动提交
SET AUTOCOMMIT=1; -- 开启自动提交
begin;
savepoint 自命名;
rollback to 保存点名字;
注意:正常结束一个事务后,不支持回滚。
commit;
注意:异常结束自动回滚,由于原子性,自动回到事务未提交时的数据状态。
-- 发生异常时自动回滚
在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。实际生产中不可能使用这种隔离级别,相当于没有任何隔离性,会有许多并发问题,如脏读、幻读、不可重复读等。
理解:假设多个客户端并发访问操作同一个数据,单个客户端的任何操作不管提交与否,其它人都看得到。
总结:不管对方提交与否,都看得到数据的修改。
该隔离级别是大多数数据库的默认隔离级别(不是 MySQL 默认的)。它满足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变。这种隔离级别会引起不可重复读,即一个事务执行时,如果多次 select,可能得到不同的结果。
理解:假设 A 在操作一个事务,B 也在操作一个事务。A 和 B 都在修改表 1,A 在执行 commit 之前,B 是看不到 A 做出的修改的。一旦 A 做出了提交,B 就可以看到 A 的修改。
总结:只要对方提交了,哪怕是多个事务,数据修改就会被其他人看到。
这是 MySQL 默认的隔离级别,它确保同一个事务,在执行中,多次读取操作数据时,会看到同样的数据行。但是会有幻读问题。
理解:假设 A 在操作一个事务,B 也在操作一个事务。A 和 B 如果操作同一个表,此时 A 完成了提交,B 是看不到修改的,B 看到的是 B 进入该事务开始时的数据。如果 A 退出事务了,那么 B 的数据就会更新到最新的。
总结:只有单方提交且退出事务,对方才看得到更改。
什么是幻读?假设 A 修改了张三的年龄,然后提交退出事务,B 此时可能在筛选年龄时出现两个张三,因为 A 提交且退出事务了,B 就会更新数据。
这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决了幻读的问题。它在每个读的数据行上面加上共享锁。
总结:一把锁,你访问数据是没有问题的,当你修改数据时,只有在你前一个事务修改完了你才可以执行修改的操作,即串行化,唯一就是效率低。
以上可以看出事务的原子性和持久性:要么成功要么不成功,数据一经提交,就是持久化。而原子性保障了数据的一致性。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;客户端会话并非是一个事务,一个客户端中可以允许多个事务,事务之前相互独立。
数据并发场景有以下三种:
- 读 - 读:不存在任何问题,也不需要并发控制。
- 读 - 写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读、幻读、不可重复读。
- 写 - 写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失。
什么是读 and 读?读写、写写就自然明白了。多个用户访问同一块数据不存在安全问题,因为只访问不修改。
用来解决读 - 写的方案:多版本并发控制(MVCC)(无锁并发控制)。
解决问题:读写互不阻塞。
如何解决?超易懂版本。
MVCC 依靠三个工具:
运行过程:当 A 去修改数据时,会加行锁(保证修改的原子性),先将原始数据放在 undo 仓库,如果有读端访问,访问的是 undo 仓库里面的,看不到 A 的修改,因为有视图范围,读写可以同时进行,视图通过划分范围可以自行屏蔽脏读——四种隔离性无非是对这三个工具'度'的把控。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL 转 CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online