Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql-存储过程并发问题_Mysql_Database Concurrency - Fatal编程技术网

Mysql-存储过程并发问题

Mysql-存储过程并发问题,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,并且更新被多次运行时 那么首先,这会发生吗?如果

我有一个存储过程,它从表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),则
更新集合val=val+1;
如果结束;
我所关心的是,当这个存储过程同时被命中,行数>3,并且更新被多次运行时

那么首先,这会发生吗?如果是这样的话,由于存储过程中不允许使用锁,如何防止这种情况发生


提前谢谢你的信息

您正在按条件更新整个表
A
。因此(即使使用InnoDB),在更新期间,整个表都将锁定在独占模式下。该锁由发动机自动获取和释放

因此,您是安全的、并发智能的。在更新完成之前,尝试从
A
读取时,所有并发线程都将处于挂起状态


但是(与您上次的评论相反),所有
更新
都将按顺序进行,并且每个更新都将增加
A.val

我认为在考虑了一段时间后,如果我将更新更改为更新一组val=v+1;我会让并发进程全部设置值,但他们会将其设置为相同的值(不是
val
)?是的,它是针对v而不是val。。。编辑post会减慢进程吗?我可能有很多连接调用此过程。将其分为两个过程会更好吗?一个是选择和测试,另一个是实际执行更新?这会阻止它锁定整个表吗?如果if原因成功,应该发生的事情很少发生。除非需要,否则我不希望它被锁定。表在执行
UPDATE
语句期间被锁定,而不是在
SELECT
期间被锁定。如果
更新
未运行,则该表将不会被锁定。