当前位置: 代码迷 >> Sql Server >> MS sql中的update set where 话语是原子操作吗
  详细解决方案

MS sql中的update set where 话语是原子操作吗

热度:68   发布时间:2016-04-24 10:23:28.0
MS sql中的update set where 语句是原子操作吗


假设一张表
create table test
(
result  char(1)  ,
mark  char(1) ,

)


然后初始化,假设就一行 ,
insert test values('1','1');


两个程序同时对这张表操作
 A 
  update test set mark = 'A',result = '1'   where mark<>'B'  ;

 
 B
  update test set mark = 'B',result  = '2'   where  mark<>'A'     ;


通过mark字段,来判断是否被另外的程序修改过了,如果被修改过了,就不再修改,

程序A 对 表 执行where判断,判断成功了,但还没有对表进行修改,
这时候程序B也对表进行 where判断,也成功了(因为A还没有对表进行修改,通过mark判断,也可以成功)
然后A,B都对表进行修改
本来是想让只能AB中的一个对表进行修改的

如果一条SQL语句是原子操作,那么不会出现我说的情况;如果不是原子操作,那么有可能出现我说的情况。

我想知道的是,是原子操作吗,,,如果可以的话,能否写个程序测试一下
------解决方案--------------------
如果你没有做过任何改动,那么update是算入“自动提交事务”,不过一个update语句影响1行还是1亿行,都是一个事务,也可以理解为一个原子操作
------解决方案--------------------
谁先获取资源上的锁谁就先执行
------解决方案--------------------
楼主看一下数据库锁的概念吧,更新操作会加排他锁(之前还有更新锁),所以两个更新操作不会并发的。
简单回答你的问题的话,update确实是原子操作
------解决方案--------------------
DML语句默认就是一个事务的,是原子操作.

当程序A 对表执行where判断,判断成功了,但还没有对表进行修改.
这时候程序B是无法对表进行where判断的. 因为程序A对表的X锁仍未释放,程序B无法申请获取X锁.
  相关解决方案