写在前面:合法学习边界
本文讲解数据库事务原理。相关测试请在自建环境完成,不要对生产数据库执行锁表、大事务或回滚操作。
一、什么是事务
事务是把一组数据库操作打包成一个原子单元:要么全部成功,要么全部回滚。
典型场景:
| |
一个事务里如果有一步失败,前面的操作都要能回滚,不能留下“只扣了钱没加钱”的半成品状态。
二、ACID 是什么
| |
初学者最容易忽略的是 I(隔离性):多个事务同时跑的时候,怎么保证彼此看不到中间态。
三、并发会带来哪些问题
1. 脏读
事务 A 修改了数据但还没提交,事务 B 读到了这个未提交的值。A 一旦回滚,B 读到的是“不存在的数据”。
| |
2. 不可重复读
同一个事务里,两次读同一行,结果不一样。
| |
3. 幻读
同一个事务里,两次查询同一范围,多出来(或消失)了行。
| |
四、MySQL 的隔离级别
| |
InnoDB 默认是 REPEATABLE READ,配合 MVCC 能解决大部分不可重复读问题,但幻读仍可能出现在特定范围查询中。
五、防御与使用建议
| |
六、小结
事务不是“用了就安全”,隔离级别决定了并发下的可见性。理解脏读、不可重复读、幻读三种异常和 MySQL 的隔离级别,才能解释为什么有时会读到“奇怪”的数据。