# 开篇
本文主旨是详细说明事务带来的四个数据库问题.
# 数据丢失
待补充
# 脏读
# 一句话
:能读到未提交事务的数据变化
解决方案:
- 设置
read committed以上的事务隔离级别
# 不可重复读
# 一句话
多次读取数据一直在变化
解决方案:
- 设置
repeatable read以上的事务隔离级别- 由要进行修改操作的事务显示使用排他锁
- 或者由重复读的事务显示使用共享锁
# 幻读
# 一句话
多次读取数据, 数据的
数量一直在变化
# 被指幻读的两个必要条件
- 只有
当前读才会出现幻读的情况, 普通查询均为快照读.- 只有在
新增时出现.
# 幻读出现的场景
# 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; |
# 可重复读如何解决幻读
请参考本专题其他文章
解决方案:
- 设置
serializable以上的事务隔离级别- 可重复读一定程度解决了幻读