请考虑这个sql语句
Create table abc (A int,B int ) insert into abc values (1,2)
以下两个陈述都做同样的事情.为什么?
update abc set A = B,B =0 where A=1
和
update abc set B =0,A = B where A=1
我想在后面的语句中首先设置B列值,然后将A列的值设置为B的值
解决方法
不可以.单个更新语句是原子的,各个部分没有顺序.
这两个:
update abc set A = B,B = 0 where A=1 update abc set B = 0,A = B where A=1
做同样的事情因为两个任务被认为是同时发生的.
换句话说,=右侧的B是B的旧值.
附录:DBMS如何实现此行为取决于编写DBMS的人员的聪明才智.
例如,DBMS可能会尝试锁定A为1的所有行,然后,完成后,执行A = B,B = 0(按此顺序,因为执行引擎认为这将满足并发性,将A设置为B在更改B)之前,在每一行上.
像集合A = B,B = A这样的语句需要更多的智能,但它可以通过先保存当前行并使用其中的值来设置新行中的值来轻松地做到这一点,例如:
read in oldrow copy oldrow to newrow newrow.A = oldrow.B newrow.B = oldrow.A write out newrow
然后它将解锁所有行.
这只是一个选择.一个非常愚蠢的DBMS可能只是锁定整个数据库文件,尽管这不会产生非常智能的并发性.
单用户,单线程DBMS根本不必关心并发性.它绝对没有锁定,只是通过每个相关的行,进行更改.