在 MySQL/InnoDB 中没有表锁定的一致读取和更新

How*_*ard 3 mysql sql

我需要在 MySQL/InnoDB 上执行以下操作。假设我有一个由 3 个列组成的表(id、计数器、状态)

我需要:

  1. 选择状态 = 0 的行
  2. 通过设置 status = 1 来更新它们,并将 counter 增加 1
  3. 将选定/更新的 id 返回给客户端

要求:

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

就性能和可扩展性(适用于大表)而言,最佳解决方案是什么?

Qua*_*noi 5

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;
Run Code Online (Sandbox Code Playgroud)