【问题标题】:Mysql - stored procedure concurrency concernMysql - 存储过程并发问题
【发布时间】:2013-08-01 19:50:25
【问题描述】:

我有一个存储过程,它从表 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;

我关心的是当这个存储过程被同时命中并且行数大于 3 并且更新运行多次时。

首先,这会发生吗?如果是这样,由于存储过程中不允许使用 Lock,我该如何防止这种情况发生?

提前感谢您的信息!

【问题讨论】:

  • 我想在考虑了一段时间之后,如果我将更新更改为 UPDATE A set val = v+1;我将让并发进程都设置值,但他们会将其设置为相同的值。
  • 你的意思是Select ID from B where total &gt; v;(不是val)?
  • 是的,它反对 v 而不是 val... 编辑帖子

标签: mysql database-concurrency


【解决方案1】:

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

所以你是安全的,并发方面。尝试从 A 读取时,所有并发线程都将被暂停,直到更新完成。

但是(与您上一条评论相反),所有UPDATE 将按顺序发生,并且每个都将递增A.val

【讨论】:

  • 这会减慢进程吗?我可能有很多连接调用此过程。将其拆分为两个过程,一个选择和测试,第二个实际进行更新会更好吗?这会阻止它锁定整个表吗?
  • 如果 if 原因成功,应该发生的情况很少。除非需要,否则我不希望它锁定。
  • 表在UPDATE语句执行期间被锁定,而不是在SELECT期间锁定。如果UPDATE 没有运行,则表根本不会被锁定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2014-08-17
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2011-06-16
  • 2016-10-28
相关资源
最近更新 更多