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

买柴火的小火柴 2014-07-08 10:43:35


假设一张表
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语句是原子操作,那么不会出现我说的情况;如果不是原子操作,那么有可能出现我说的情况。

我想知道的是,是原子操作吗,,,如果可以的话,能否写个程序测试一下
...全文
1823 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2014-07-09
  • 打赏
  • 举报
回复
DML语句默认就是一个事务的,是原子操作. 当程序A 对表执行where判断,判断成功了,但还没有对表进行修改. 这时候程序B是无法对表进行where判断的. 因为程序A对表的X锁仍未释放,程序B无法申请获取X锁.
hujiiori 2014-07-09
  • 打赏
  • 举报
回复
楼主看一下数据库锁的概念吧,更新操作会加排他锁(之前还有更新锁),所以两个更新操作不会并发的。 简单回答你的问题的话,update确实是原子操作
發糞塗牆 2014-07-08
  • 打赏
  • 举报
回复
谁先获取资源上的锁谁就先执行
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
如果你没有做过任何改动,那么update是算入“自动提交事务”,不过一个update语句影响1行还是1亿行,都是一个事务,也可以理解为一个原子操作
也就是说,不论A,B执行该语句的顺序,他们把该命令提交给服务端,但服务端会为两条命令排列顺序,也就是说他们在服务端一定有着某个顺序,然后服务端逐条解析命令,执行操作 。不知道 数据库的运行机制。。。
發糞塗牆 2014-07-08
  • 打赏
  • 举报
回复
如果你没有做过任何改动,那么update是算入“自动提交事务”,不过一个update语句影响1行还是1亿行,都是一个事务,也可以理解为一个原子操作

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧