----原子性测试-----表t1,id只能等于1
create table t1
(id int constraint chk_id check(id=1)
)
--表t2
create table t2
(id int 
)--测试数据
insert into t2 values(1)
insert into t2 values(2)
insert into t2 values(3)
insert into t2 values(4)
insert into t2 values(5)
--情况1
insert into t1 select id from t2--结果:表中没有插入记录
--说明:虽然t2表中包含1,但是sql server将insert语句作为一个逻辑单元,由于原子性,所以未插入记录
--情况2 transaction
begin tran insert into t1 select id from t2
insert into t1 values(1)

commit--结果:t1中插入一条记录
--说明:单独的begin tran,commit不具有原子性--情况3
set XACT_ABORT on
begin tran insert into t1 select id from t2
insert into t1 values(1)

commit--结果:表中没有插入记录
--说明:set XACT_ABORT 在语句失败时自动回滚(之前的如果正确还是执行,见情况4)--情况4
set XACT_ABORT on
begin tran
insert into t1 values(1)
insert into t1 select id from t2
insert into t1 values(1)

commit--结果:t1中插入一条记录
--情况5 try catch
begin try
begin tran
insert into t1 values(1)
insert into t1 select id from t2
insert into t1 values(1)
commit
end try
begin catch
  rollback
   print 'error'
  return
end catch--结果:表中没有插入记录
--说明: try catch 使语句具有原子性

解决方案 »

  1.   

    说实话我不知道啥是原子性,书看得少呵呵 就说一点 XACT_ABORT 选项是判断错误什么情况下的回滚问题
    当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。OFF 是默认设置。
      

  2.   


    --情况4
    set XACT_ABORT on
    begin tran
        insert into t1 values(1)
        insert into t1 select id from t2
        insert into t1 values(1)
        
    commit只是回滚错误以后的语句,之前的语句还是执行成功了