繁体   English   中英

一致的读取和更新,而无需在MySQL / InnoDB中锁定表

[英]Consistent read and update without table locking in MySQL/InnoDB

我需要在MySQL / InnoDB上执行以下操作。 假设我有一个表,包含3个列(ID,计数器,状态)

我需要:

  1. 选择状态为0的行
  2. 通过将状态设置为1来更新它们,并将计数器增加1
  3. 将所选/更新的ID返回给客户端

要求:

  • 要更新的行必须与所选行完全相同,即使在第一个选择之后添加了新行
  • 不允许连续重复更新,即使多个脚本同时在同一数据上运行

在性能和可伸缩性(适用于大型表)方面,什么是最佳解决方案?

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
SELECT  id
FROM    mytable
WHERE   status = 0
FOR UPDATE;
UPDATE  mytable
SET     status = 1,
        cnt = cnt + 1
WHERE   status = 0;
COMMIT;

您可以在一条语句中选择和更新,该语句应自动执行:

UPDATE tbl SET status=1, counter=counter+1 WHERE status=0;

我不知道您在第3步中想要什么,因为涉及多个ID。 您是否要使用SELECT语句中的ID行表? 如果是这样,则可以使用存储过程,也可以使用SELECT ... LOCK IN SHARE MODE

你可以做

SELECT  id
FROM    mytable
WHERE   status = 0
FOR UPDATE;

然后在您的软件中构建ID列表,然后执行

UPDATE  mytable
SET     status = 1,
        cnt = cnt + 1
WHERE   id IN (...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM