我有一个存储过程,从表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?
提前感谢您的信息!
答案 0 :(得分:0)
您无条件地更新整个表A
。因此(即使使用InnoDB)整个表将在更新时锁定在独占模式。该锁定由引擎自动获取和释放。
所以你是安全的,并发性的。尝试从A
读取时,所有并发线程将被置于保持状态,直到更新完成。
但是(与您上次发表的评论相反),所有UPDATE
都会按顺序发生,每个A.val
都会增加{{1}}。