制作插入.选择陈述原子



我有两个表:一个存储数据,另一个存储锁表示用户何时在该数据上操作。我想从第一表中选择一些数量的项目,以便它们匹配多个条件,并且在另一个表中没有相应的锁定,然后将这些项目的锁添加到第二个表中。由于许多用户可能同时尝试锁定项目,因此必须在原子上完成此操作。

我已经写了下面的SQL语句来尝试这样做,但是我收到了错误Deadlock found when trying to get lock;

INSERT INTO table2 (id, user, date)
    SELECT id, ?, NOW()
    FROM table1
    LEFT JOIN table2 USING id
    WHERE locked IS NULL AND <several conditions on table1>
    ORDER BY date 'DESC'
    LIMIT 15;

有什么办法可以在不锁定桌子的情况下使其成为原子操作?目前,我正在使用交易并进行重新计算,如果没有成功,但是我对这是否可以避免感兴趣。我正在使用InnoDB的MySQL版本5.0.95。

谢谢

编辑

给出了这一进一步的想法,我已经意识到,尽管锁定table1是不可接受的,但我可以锁定table2。由于我实际上不能将表锁定在语句中(因为如果我选择锁定其中一个,则必须锁定所有表),我可以使用get_lock创建一个sutex,以防止多个进程同时调用此代码。我还没有机会测试这种方法,但是感觉可能比交易更轻巧的解决方案。

no。这就是交易的全部内容。他们在一个原子操作中组织了一堆陈述,该操作是成功或整体失败的操作。

在这里,您可以找到一些解释 Opportistic PESIMISTIC 锁定的解释,也许您会发现有用。在这里,您可以找到有关InnoDB中使用的锁定机制(Pesimistic锁定)的一些详细信息。在这里,您可以找到有关如何在MySQL中实现乐观锁定的准则。

最新更新