Mysql-存储过程并发问题
我有一个存储过程,它从表a中选择值,然后用于从表B中选择。如果行数小于阈值,它将更新表a的值并重新选择表BMysql-存储过程并发问题,mysql,database-concurrency,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; 从A选择val到v; 从B中选择ID,其中total>v; 如果(找到行()3,并且更新被多次运行时 那么首先,这会发生吗?如果
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;
从A选择val到v;
从B中选择ID,其中total>v;
如果(找到行()<3),则
更新集合val=val+1;
如果结束;
我所关心的是,当这个存储过程同时被命中,行数>3,并且更新被多次运行时
那么首先,这会发生吗?如果是这样的话,由于存储过程中不允许使用锁,如何防止这种情况发生
提前谢谢你的信息 您正在按条件更新整个表
A
。因此(即使使用InnoDB),在更新期间,整个表都将锁定在独占模式下。该锁由发动机自动获取和释放
因此,您是安全的、并发智能的。在更新完成之前,尝试从A
读取时,所有并发线程都将处于挂起状态
但是(与您上次的评论相反),所有
更新
都将按顺序进行,并且每个更新都将增加A.val
我认为在考虑了一段时间后,如果我将更新更改为更新一组val=v+1;我会让并发进程全部设置值,但他们会将其设置为相同的值代码>(不是val
)?是的,它是针对v而不是val。。。编辑post会减慢进程吗?我可能有很多连接调用此过程。将其分为两个过程会更好吗?一个是选择和测试,另一个是实际执行更新?这会阻止它锁定整个表吗?如果if原因成功,应该发生的事情很少发生。除非需要,否则我不希望它被锁定。表在执行UPDATE
语句期间被锁定,而不是在SELECT
期间被锁定。如果更新
未运行,则该表将不会被锁定。