我从网上查了下,这句话的作用是:
“当   SET   XACT_ABORT   为   ON   时,如果   Transact-SQL   语句产生运行时错误,整个事务将终止并回滚。为   OFF   时,只回滚产生错误的   Transact-SQL   语句,而事务将继续进行处理。编译错误(如语法错误)不受   SET   XACT_ABORT   的影响。”
在sql中用事务的时候一般是这么写
begin tran
sql语句
if @@error>0
rollback tran
else
commit tran
我想问一下,“SET XACT_ABORT ON”这句话是不是和我们判断事务出错“if @@error>0 rollback tran”是一个作用的啊?我在看这个解释的时候,他举得个例子,例子里面的事务是没有判断sql出错回滚的,是不是如果直接写
begin tran 
sql语句
commit tran
的时候加这个“SET XACT_ABORT ON”,如果写了判断的话就不用写这句话了啊?还有就是在一个事务里面如果判断事务回滚,整个事务里面的sql语句是不是都一块回滚了?请高手帮忙解答下,谢谢啦!

解决方案 »

  1.   

    如果不加:SET XACT_ABORT ON,那么存储过程中的每个句子都要进行事务出错判断。如:begin tran  
    sql语句1
    if @@error>0
    rollback tran
    sql语句2
    if @@error>0
    rollback tran
    commit tran还有就是在一个事务里面如果判断事务回滚,整个事务里面的sql语句是不是都一块回滚了?
    --是都回滚!!
      

  2.   

    ,“SET XACT_ABORT ON”这句话是不是和我们判断事务出错“if @@error>0 rollback tran”是一个作用的啊如果if @@error>0 rollback tran回滚的是整个事务那就一样。
    如果不是。那肯定就不一样。你COPY和帮助文档说的很清楚了
      

  3.   

    我发现还是加上这句话好,但是还是有疑问,我做了下面的例子,事务之间进行嵌套,如果用判断事务的办法,嵌套的子事务如果不出错,外面的语句出错,那么整个事务只会回滚外面出错的语句,子事务提交成功了就回滚不了了。但我如果用“SET XACT_ABORT ON”,即使子事务提交成了,整个外围事务出错,子事务也会回滚--创建2个表
    create table tran1(id int,name varchar(10))
    create table tran2(id int,name varchar(10))--存储过程1
    create proc TesTran as
    begin
    begin tran
    insert into tran1 values (1,'1的极')
    insert into tran2 values (2,'2的的是大多数防辐射服是否到')
    if @@error>0
    rollback tran
    else
    commit tran
    end--存储过程2
    create proc TesTranAll as
    begin
    begin tran
    insert into tran1 values (1,'1的')
    exec TesTran
    if @@error>0
    rollback tran
    else
    commit tran
    end--执行存储过程
    exec TesTranAll--执行存储过程后,查询表
    select * from tran1
    select * from tran2
      

  4.   

    --存储过程1
    alter proc TesTran as
    begin
    begin tran
    insert into tran1 values (1,'1的极')
    insert into tran2 values (2,'2的的是')
    if @@error>0
    rollback tran
    else
    commit tran
    end--存储过程2
    alter proc TesTranAll as
    begin
    begin tran
    insert into tran1 values (1,'1的十分十分师范生')
    exec TesTran--执行存储过程1
    if @@error>0
    rollback tran
    else
    commit tran
    end--执行存储过程
    exec TesTranAll
    我这样写的话,执行完后查询表2个表里面都有数据了,如果我把存储过程2改成:
    alter proc TesTranAll as
    begin
    set XACT_ABORT on
    begin tran
    insert into tran1 values (1,'1的十分十分师范生')
    exec TesTran
    commit tran
    end
    这样的话,执行存储过程2,查询2个表就都没有数据!
    “SET XACT_ABORT ON”是这么牛的啊?
      

  5.   

    我现在感觉是以后写事务就直接用“SET XACT_ABORT ON”了,安全保险,不管嵌套几层事务都会完全回滚,如果要按需求做,那请问这句话和
    if @@error>0
    rollback tran
    else
    commit tran
    end
    这句话相比,有性能或者什么方面的差别吗?如果判断会更省资源等的,那在一般情况下我就用判断的。如果没什么区别那我以后就用这句话了。
    这方面的东西都不了解,麻烦大侠指导下,谢谢!