mysql事务同时发生

txu3uszq  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(403)

两个事务可以同时发生吗?假设您有事务a和b,每个事务都将执行一次读取以获取某列的最大值,然后执行一次写入以插入一个最大值为+1的新行。有没有可能a执行一次读取以获得最大值,然后b在a写入之前执行一次读取,从而导致两个事务都向列写入相同的值?
在隔离级别设置为readuncommitted为false的情况下这样做似乎可以防止重复,但我不知道为什么。

7y4bm7vi

7y4bm7vi1#

两个事务可以同时发生吗?
是的,这是很有可能的,事实上,所有rdbms都需要支持现成的特性来加快速度。想想一个同时被数千个用户访问的应用程序,如果一切都按顺序进行,用户可能要等上一天才能得到响应。
假设您有事务a和b,每个事务都将执行一次读取以获取某列的最大值,然后执行一次写入以插入一个最大值为+1的新行。有没有可能a执行一次读取以获得最大值,然后b在a写入之前执行一次读取,从而导致两个事务都向列写入相同的值?
如果a&b发生在两个不同的会话中,那么它很可能是一个用户案例。
在隔离级别设置为readuncommitted为false的情况下执行此操作似乎可以防止重复,但我不知道为什么?
我认为,使用隔离块获取下一个增量的要求是很常见的,这里需要指示数据库进行互斥 read operation for writing 操作必须发生时,可以通过设置隔离来指示数据库执行,也可以是“临时隔离”级别来解决您的问题。
如果得到下一个数字是唯一的问题,而你没有其他的限制,那么 My Sql AUTO_INCREMENT 最适合你的答案。但似乎,你已经明确地问了这个问题,意味着,你可能已经有所克制了。
参考我的类似问题和答案。
你的解决方案应该是下面这样的。

begin;
select last_number from TABLE1 ... FOR UPDATE;

Read the result in App.

update TABLE1 set last_number=last_number+1 where ...;
commit;

相关问题