版本号机制和mysql的RR隔离级别有冲突吗?

发布于 2022-09-12 00:21:56 字数 552 浏览 9 评论 0

我们都知道mysql数据库有四个事务隔离级别,第三种是 REPEATABLE READ(mysql的默认隔离级别),在这种隔离级别下,当前事务无法读到,当前事务开启之后数据库数据的变化。这很好的解决了第二种事务隔离级别的不可重复读的问题。

在多进程并发的场景下,我们为了解决多个进程同时修改同一条数据,造成的混乱问题,我们常常使用乐观锁,乐观锁常见的实现方式之一是采用版本号机制。
1.这种机制是在某个具体的表中多加一个version字段。当某个进程修改这条数据时,都会给version字段加一个1。
2.在修改提交时会校验当前的version字段是否大于数据库中数据的version字段,如果是则提交修改,如果不是则不提交当前修改。

基于上面的背景,我有一个疑惑。
在mysql的默认隔离级别RR下,在事务提交之前,是无法感知到事务开启之后数据库的变化的。也就是说这种情况下,即使别的事务修改并提交了这个这条数据,version也加1了,当前的事务也是无法感知到的。那么自然也无法校验当前version是否大于数据库里的字段version了。
所以我不太清楚版本号机制如何在mysql的RR隔离级别中实现。
请前辈们指导一下。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怂人 2022-09-19 00:21:56

事务里面 version + 1 的时候,会把记录锁住;
这时候在事务外面更新的那条 sql 会锁住,一直等到事务提交了,才执行。执行的时候就会发现 version 变化了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文