可重复读解决了幻读问题了吗
可重复读解决了幻读问题了吗
结论
没有。但是解决了大部分的。
情况一 快照读+当前读
默认都开启事务。假设表有a,b字段,有99行数据。
事务A | 事务B |
---|---|
1 快照读 a>90; | |
2 插入行a=100;并提交 | |
3 当前读 a>90; 发现可以读取到a=100的行 |
注意,快照读和当前读不能调转顺序,因为当前读是加锁操作,会阻塞插入操作
原因
当前读没有使用mvcc机制,当前读会对最新的数据读取并且加锁
解决方案
在开始事务后尽快执行当前读,或者都是用同一种读取方式。查询都用快照读或都用当前读
情况二 两次快照读
默认都开启事务。假设表有a,b字段,有99行数据。
事务A | 事务B |
---|---|
1 快照读 a>90; | |
2 插入行a=100;并提交 | |
3 更新a=100的行 | |
4 快照读 a>90; 发现可以读取到a=100的行 |
原因
第一次读取没有加锁,只生成了mvcc
更新a=100,更新成功,因为没有加锁,并且事务B已经提交了。事务B没有提交的话,更新会阻塞
第二次读取可以读取到a=100,因为第三步修改了a=100,最新行的trx_id保存着事务A的id。
解决方案
避免更新查询不到的数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)