事务 A (版本号为 2 )
1、START TRANSACTION;
2、SELECT * FROM test_mvcc WHERE id = 1;
6、UPDATE test_mvcc SET `value` = 'b' WHERE id = 1;
7、COMMIT;
事务 B (版本号为 3 )
3、START TRANSACTION;
4、UPDATE test_mvcc SET `value` = 'c' WHERE id = 1;
5、COMMIT;
SQL 语句前面的序号为执行顺序,事务 A 开始做了一个快照读。然后事务 B 开启,修改数据并提交,此时数据的版本号应该是 3。这时候事务 A 也修改数据,然后提交的时候发现数据库中数据的版本号比自己的大,所以修改失败回滚操作。
以上是最近通过学习 MVCC 我认为理论上应该出现的情况,然后我自己测试发现事务 A 还是能提交成功,这究竟是什么原因?难道是哪里的理解有偏差吗。(当前数据库隔离级别为 Read Repeatable )
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.