可重复读解决了幻读问题了吗

可重复读解决了幻读问题了吗

结论

没有。但是解决了大部分的。

情况一 快照读+当前读

默认都开启事务。假设表有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。

解决方案

避免更新查询不到的数据


posted @   xiuer211  阅读(114)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示