事务期间不会阻止SQL UPDATE / INSERTS

时间:2019-05-05 05:35:13

标签: 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 > 1556953200000;
COMMIT;

但是它似乎并没有阻止这些UPDATES / INSERTS,并且似乎确实可以在事务的INSERT发生之前将其传递到新创建的sales表中。这使我在事务插入时出现错误:

(1062, "Duplicate entry '1' for key 'PRIMARY'")

我认为该事务将阻止UPDATES / INSERTS直到提交,但在这里似乎并非如此。 所以我觉得我需要获得一把锁。我该怎么做(如果这是解决此问题的正确方法)?

1 个答案:

答案 0 :(得分:2)

如果您想在执行此类操作时防止在表上进行更新,则需要锁定表而不是使用事务。我建议创建新表,将其与旧表锁定,进行重命名switcheroo,进行插入,然后释放锁。无需进行交易。事务避免不一致,但是不能保证顺序,并且在任何情况下,诸如create和named表之类的DDL语句都不安全。