Mysql 正在插入。。。SELECT语句原子
我有两个表:一个存储数据,另一个存储锁以指示用户何时操作该数据。我想从第一个表中选择一些项目,使它们匹配多个条件,并且在另一个表中没有相应的锁,然后将这些项目的锁添加到第二个表中。由于许多用户可能同时尝试锁定项目,因此有必要以原子方式进行锁定 我编写了下面的SQL语句来尝试这样做,但在尝试获取锁时收到错误Mysql 正在插入。。。SELECT语句原子,mysql,sql,innodb,Mysql,Sql,Innodb,我有两个表:一个存储数据,另一个存储锁以指示用户何时操作该数据。我想从第一个表中选择一些项目,使它们匹配多个条件,并且在另一个表中没有相应的锁,然后将这些项目的锁添加到第二个表中。由于许多用户可能同时尝试锁定项目,因此有必要以原子方式进行锁定 我编写了下面的SQL语句来尝试这样做,但在尝试获取锁时收到错误死锁 INSERT INTO table2 (id, user, date) SELECT id, ?, NOW() FROM table1 LEFT JOIN tabl
死锁代码>
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;
插入到表2中(id、用户、日期)
选择id,现在()
来自表1
使用id左连接表2
其中locked为NULL,并且
按日期“DESC”订购
限额15;
有没有办法让这成为一个原子操作而不锁定表?目前我正在使用一个事务,如果它不成功,我会重新尝试,但我感兴趣的是这是否是可以避免的。我在InnoDB上使用MySQL版本5.0.95
谢谢
编辑
经过进一步思考,我意识到虽然锁定表1是不可接受的,但我可以锁定表2。由于我实际上无法在语句中锁定表(因为如果我选择锁定其中一个表,我必须锁定所有表),因此我可以使用GET_lock创建一个互斥锁,以防止多个进程同时调用此代码。我还没有机会测试这种方法,但感觉它可能比事务更轻量级。没有。这就是事务的全部内容。它们在一个原子操作中组织一组语句,作为一个整体,这些操作要么成功,要么失败
你可以找到一些关于乐观的和悲观的锁的解释,也许你会发现这些解释很有用。您可以找到InnoDB中使用的锁定机制的一些细节(伪锁)。您可以找到有关如何在mysql中实现乐观锁定的指导原则。与您的问题无关,但如果locked是表2中的一个字段,则必须将其上的筛选器从where子句移动到join子句。否则,你实际上有一个内部连接。我肯定需要阅读更多关于连接如何工作的内容,因为我不知道不同类型的连接。如果第一个表中的大多数项都有相应的锁,我假设您的建议会提高性能?由于表2通常是空的,它是否提供了其他好处?