脏读
- 定义:一个事务读取了另一个事务尚未提交的数据 。比如事务 A 修改了某条数据但还没提交,此时事务 B 读取了这条被修改但未提交的数据。若事务 A 后续回滚,事务 B 读到的数据就是无效的,相当于读到了 “脏数据”。
- 危害:可能基于错误或不存在的数据做决策,破坏数据一致性 。比如银行转账,转账事务未提交时,查询事务若读取到未确定的转账结果,会造成账户金额显示混乱。
- 解决方法:提高事务隔离级别,使用 “读已提交” 及以上隔离级别 。比如在 MySQL 中,可将事务隔离级别设置为 “读已提交”(Read Committed),确保事务只能读取已提交的数据。
幻读
- 定义:在一个事务内,相同的查询多次执行,结果集数量却不同(主要因其他事务新增或删除数据导致) 。比如事务 A 查询满足条件的一批数据,事务 B 在期间插入满足条件的新数据并提交,事务 A 再次查询时就会多读到新插入的数据,仿佛出现 “幻觉”。
- 危害:破坏事务一致性,影响基于查询结果的业务逻辑 。比如统计库存商品数量时,幻读会使统计结果不准确,影响后续采购、销售等决策。
- 解决方法:使用更严格的隔离级别,如 “可串行化”(Serializable) ,或者利用行级锁、多版本并发控制(MVCC)等机制。在 InnoDB 引擎的可重复读隔离级别下,通过 MVCC 技术在一定程度上解决幻读问题。
可重复读
- 定义:一个事务多次读取同一数据时,在事务执行期间,其他事务不能对该数据进行修改(包括读写操作),保证同一事务内多次读取结果一致 。比如事务 A 多次读取某条订单数据,在事务 A 结束前,其他事务无法修改这条订单数据。
- 作用:防止脏读、不可重复读 ,保证事务内数据的一致性和稳定性,让事务在读取数据时不受其他事务干扰。
- 实现原理:以 MySQL 的 InnoDB 引擎为例,通过 MVCC 技术实现,在事务开始时创建一致性读视图(快照),后续读操作基于该快照获取数据 。