Mysql - 存储过程并发关注

时间:2013-08-01 19:50:26

标签: mysql database-concurrency

我有一个存储过程,从表A中选择一个值然后用于从表B中选择。如果行数小于阈值,它会更新表A的值并重新选择表B.

Select val into v from A;
Select ID from B where total > v;

if (Found_Rows() < 3) then
  Update A set val = val +1;
end if;

我关心的是同时点击这个存储过程并且行数是&gt; 3,更新运行多次。

首先,这可能发生吗?如果是这样,我怎么能防止这种情况发生,因为存储过程中不允许使用Lock?

提前感谢您的信息!

1 个答案:

答案 0 :(得分:0)

您无条件地更新整个表A。因此(即使使用InnoDB)整个表将在更新时锁定在独占模式。该锁定由引擎自动获取和释放。

所以你是安全的,并发性的。尝试从A读取时,所有并发线程将被置于保持状态,直到更新完成。

但是(与您上次发表的评论相反),所有UPDATE都会按顺序发生,每个A.val都会增加{{1}}。