Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 正在插入。。。SELECT语句原子_Mysql_Sql_Innodb - Fatal编程技术网

Mysql 正在插入。。。SELECT语句原子

Mysql 正在插入。。。SELECT语句原子,mysql,sql,innodb,Mysql,Sql,Innodb,我有两个表:一个存储数据,另一个存储锁以指示用户何时操作该数据。我想从第一个表中选择一些项目,使它们匹配多个条件,并且在另一个表中没有相应的锁,然后将这些项目的锁添加到第二个表中。由于许多用户可能同时尝试锁定项目,因此有必要以原子方式进行锁定 我编写了下面的SQL语句来尝试这样做,但在尝试获取锁时收到错误死锁 INSERT INTO table2 (id, user, date) SELECT id, ?, NOW() FROM table1 LEFT JOIN tabl

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

我编写了下面的SQL语句来尝试这样做,但在尝试获取锁时收到错误
死锁

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通常是空的,它是否提供了其他好处?