Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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是唯一的行交换原子吗?_Mysql_Unique Constraint_Atomicity - Fatal编程技术网

MySQL是唯一的行交换原子吗?

MySQL是唯一的行交换原子吗?,mysql,unique-constraint,atomicity,Mysql,Unique Constraint,Atomicity,我得出的结论是,交换两行的唯一方法是将第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=[

我得出的结论是,交换两行的唯一方法是将第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,然后按照上面描述的模式进行操作——当然,禁用了autocommit


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

您不能同时执行两个或多个语句。他们总是一个接一个地被处决


但是,如果使用事务(备注:这只适用于innodb类型的表,而不适用于myisam),则此选择要么失败,不留任何更改,要么成功。同时尝试使用数字-1的第二次交换将被锁定,直到第一次交易完成

我从来没有在一次声明中说过我会这么做。该示例是总共三条语句,后跟一个commit。然而,如果你是正确的,那么你已经证实了我最初的理解,我所做的是好的,。