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 SQL更新/插入在事务期间未被阻止_Mysql_Sql_Transactions_Sql Update_Blocking - Fatal编程技术网

Mysql SQL更新/插入在事务期间未被阻止

Mysql SQL更新/插入在事务期间未被阻止,mysql,sql,transactions,sql-update,blocking,Mysql,Sql,Transactions,Sql Update,Blocking,我有一个表,它不断地从其他进程发送更新/插入,我正在尝试对我的SQL表执行一个事务,在该事务中,我旋转该表,并将最后的一些值移动到我刚刚创建的新表中: BEGIN TRANSACTION; CREATE TABLE temp LIKE sales; RENAME TABLE sales TO sales_05_04_19, temp TO sales INSERT INTO sales SELECT * FROM sales_05_04_19 WHERE time > 1556953200

我有一个表,它不断地从其他进程发送更新/插入,我正在尝试对我的SQL表执行一个事务,在该事务中,我旋转该表,并将最后的一些值移动到我刚刚创建的新表中:

BEGIN TRANSACTION;
CREATE TABLE temp LIKE sales;
RENAME TABLE sales TO sales_05_04_19, temp TO sales
INSERT INTO sales SELECT * FROM sales_05_04_19 WHERE time > 1556953200000;
COMMIT;
但它似乎并没有阻止这些更新/插入,有些似乎在事务插入发生之前就实际完成了新创建的销售表。这导致我在事务插入时出错:

(1062, "Duplicate entry '1' for key 'PRIMARY'")
我以为这个事务会在提交之前阻止更新/插入,但这里的情况似乎不是这样。
所以我觉得我需要一把锁。我该怎么做(如果这是解决此问题的正确方法)?

如果要在执行此类操作时阻止表上的更新,则需要锁定表,而不是使用事务。我建议创建新表,锁定它和旧表,执行重命名开关,执行插入,然后释放锁。没有必要进行交易。事务可以避免不一致性,但它们不能保证顺序,而且像create和rename table这样的DDL语句在任何情况下都不是事务安全的。

如果要在执行此类操作时阻止表上的更新,则需要锁定表,而不是使用事务。我建议创建新表,锁定它和旧表,执行重命名开关,执行插入,然后释放锁。没有必要进行交易。交易避免了不一致,但不能保证订单,在任何情况下,create和rename table等DDL语句都不是事务安全的。

执行锁定的用户除了需要创建和重命名表所需的其他权限外,还需要LOCK TABLES权限。执行锁定的用户除了需要其他权限外,还需要LOCK TABLES权限用于创建和重命名表。