# 开篇

本文主旨是详细说明事务带来的四个数据库问题.

# 数据丢失

待补充

# 脏读

# 一句话

:能读到未提交事务的数据变化

解决方案:

  1. 设置read committed以上的事务隔离级别

# 不可重复读

# 一句话

多次读取数据一直在变化

解决方案:

  1. 设置repeatable read以上的事务隔离级别
  2. 由要进行修改操作的事务显示使用排他锁
  3. 或者由重复读的事务显示使用共享锁

# 幻读

# 一句话

多次读取数据, 数据的数量一直在变化

# 被指幻读的两个必要条件

  1. 只有当前读才会出现幻读的情况, 普通查询均为快照读.
  2. 只有在新增时出现.

# 幻读出现的场景

# for update多次当前读导致幻读(read committed及以下会出现)

sessionA sessionB sessionC
T1 begin;
select * from t where d=5 for update
result:(5,5,5)
T2 update t set d=5 where id=0
T3 select * from t where d=5 for update
result:(0,0,5),(5,5,5)
T4 insert into t values(1,1,5)
T5 select * from t where d=5 for update
result:(0,0,5),(1,1,5),(5,5,5)
T6 commit;

# 可重复读如何解决幻读

请参考本专题其他文章

解决方案:

  1. 设置serializable以上的事务隔离级别
  2. 可重复读一定程度解决了幻读
修改于: 8/11/2022, 3:17:56 PM