MySQL事务同时发生

时间:2018-06-27 20:18:54

标签: mysql transactions

两个交易可以同时进行吗?假设您有事务A和B,每个事务将执行读取操作以获取某一列的最大值,然后执行写入操作以插入具有该max + 1的新行。是否有可能A进行读取以获得最大值,然后B在A写入之前执行读取,从而导致两个事务将相同的值写入该列?

将隔离级别设置为未提交为false来执行此操作似乎可以防止重复,但是我无法绕开为什么。

1 个答案:

答案 0 :(得分:0)

  

两个交易可以同时进行吗?

是的,这是完全有可能的,实际上,所有RDBMS都需要立即支持该功能以加快处理速度。考虑一下成千上万的用户同时访问的应用程序,如果一切按顺序进行,则用户可能需要等待一天才能获得响应。

  

假设您有事务A和B,每个事务将执行读取操作以获取某一列的最大值,然后执行写入操作以插入具有该max + 1的新行。是否有可能A进行读取以获得最大值,然后B在A写入之前执行读取,从而导致两个事务将相同的值写入该列?

如果A和B发生在两个不同的会话中,则很可能是用户案例。

  

将隔离级别设置为未提交为false来执行此操作似乎可以防止重复,但是我无法绕开为什么?

我认为,使用隔离块获取下一个增量号的要求很常见,在这里您需要指示数据库执行互斥read operation for writing操作,您可以指示数据库执行此操作,通过设置隔离级别,或者可能是“临时隔离”级别可以解决您的问题。

如果仅获取下一个数字是问题,而您没有其他约束,那么

My Sql AUTO_INCREMENT最适合您。 但是看来,您已经特别询问了这个问题,这意味着您可能受到了限制。

请参阅我的类似问题和answer

您的解决方案应如下所示。

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

Read the result in App.

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