我想把多条SQL语句做成同一事务,例如如
insert into t where ....
delete from t where ....
我写成这样:
begin tran 
insert into t where ....
delete from t where ....
commit tran在第一条insert语句因插入时发生主键冲突而报错,接下来的delete语句还是把记录删除了,为什么呢?同一个事务里,应该不会被删除的啊.

解决方案 »

  1.   

    if   @@error=0   
    rollback   tran
      

  2.   

    ----启用事务,将插入和删除放到一个事务中,任何一步出错均回滚整个事务
    BEGIN TRANSACTION
    insert into t where ....
    if @@error <> 0
    begin
        raiserror('插入时发生错误,本次插入失败!',16,1)
        rollback   /*若插入时发生错误则回滚整个事务*/
        return     /*若发生错误则中止执行而返回*/
    end
    delete from t where ....
    if @@error <> 0
    begin
        raiserror('删除时发生错误,本次删除失败!',16,1)
        rollback   /*若删除时发生错误则回滚整个事务*/
        return     /*若发生错误则中止执行而返回*/
    end
    ----提交事务
    commit transaction
      

  3.   

    请参考:http://community.csdn.net/Expert/topic/5647/5647136.xml?temp=.2376367http://community.csdn.net/Expert/topic/5645/5645989.xml?temp=.1304285
      

  4.   

    --那是因为你没有设置set xact_abort on。--下面这样设置就不会出现你说的情况了:set xact_abort onbegin tran 
    insert into t where ....
    delete from t where ....
    commit tran
      

  5.   

    只判断@error<>0是不够的,因为如果发生严重的错误,根本就不会执行到你的判断代码。所以要设置:set xact_abort on
      

  6.   

    set xact_abort on
    begin tran
    insert into t where ....
    if @@error <> 0
    begin
     rollback tran
     return
    end
    delete from t where ....
    commit tran
      

  7.   

    谢谢各位
    set xact_abort on在sybase里有类似的命令吗,因为我现在用的是SYBASE数据库.