【问题标题】:Is MySQL unique row swap atomic?MySQL唯一的行交换是原子的吗?
【发布时间】:2015-04-16 10:33:19
【问题描述】:

我得出的结论是,在要交换的值是唯一约束的一部分的情况下,交换两行的唯一方法是将第 1 行更新为正常范围之外的临时值(例如负数对于 INT 列),将第 2 行更改为第 1 行的前一个值,并将第 1 行更改为第 2 行的前一个值。

简化示例:

SELECT uniquevalue1 AS prev1 FROM sometable;
SELECT uniquevalue2 AS prev2 FROM sometable;

UPDATE sometable SET uniquevalue1=-1;
UPDATE sometable SET uniquevalue2=[prev1];
UPDATE sometable SET uniquevalue1=[prev2];

随后是提交。

这很好用,没问题,但是:

这个操作安全吗?

想象一下默认(有符号)INT(11) 列上的唯一约束,您可以在其中临时交换为 -1,然后遵循上述模式 - 当然,禁用自动提交。

如果同时执行这两个交换操作会发生什么?在 -1 之后没有提交是否不再是任何行的值意味着语句不会发生冲突?

【问题讨论】:

    标签: mysql unique-constraint atomic


    【解决方案1】:

    您不能同时执行两个或多个语句。它们总是被一一执行。

    但是,如果您使用事务(备注:这仅适用于 innodb 类型的表,而不适用于 myisam),则此操作将失败且没有任何更改或成功。也尝试使用数字 -1 的第二个交换将被锁定,直到第一个事务完成。

    【讨论】:

    • 我从来没有说过我会在一份声明中这样做。该示例总共是三个语句,然后是一个提交。但是,如果您是正确的,那么您已经确认了我最初的理解,即我正在做的事情是可以的。
    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多