【问题标题】:Reliably assign a row to a user in MySQL在 MySQL 中可靠地为用户分配一行
【发布时间】:2014-11-07 21:30:12
【问题描述】:

我有一张包含数百万行的表格:

id | info | uid

uid 默认为空。我想选择 10 行并将它们分配给一个 uid,但我想避免任何潜在的并发问题。因此,我认为唯一的方法是根据特定条件以某种方式选择 10 行,锁定这些行,然后在解锁它们之前进行更改。

有没有办法在 MySQL 和 PHP 中进行行锁定?还是有其他方法可以保证不会发生这种情况:

  1. 用户 a 查询 uid 为空的表
  2. 找到第 1 行
  3. 用户b查询uid为null的表
  4. 找到第 1 行
  5. 用户一个进程行并将其设置回 null
  6. 用户 b 处理行并将其设置回 null

看到我的问题了吗?

【问题讨论】:

标签: mysql


【解决方案1】:

您可能需要的是SELECT ... FOR UPDATE。这样,检索到的行将被锁定,直到生成 COMMITROLLBACK。所以你可以做类似的事情:

START TRANSACTION;

SELECT * FROM yourTable WHERE uid IS NULL FOR UPDATE;

-- UPDATE to whatever you want

COMMIT;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多