假设一张表
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锁.