--显式事务---
use
test
go
begin tran
select * from tb10  --假设这句没有任何问题
insert tb10 values('news.aspx?newsID=1992',156456,'好人啊....','hwj,'20080808','fdsfdsfsd',12) --假设这句违反PK约束(但是在实际情况中不知道那句或几句会出错)
update tb10 set realID = 8888 where realID = 1997 --假设这句没有任何问题,数据库有相应记录
if @@error <> 0  --这个@@error只检测最后一句发生问题的代码???
begin
rollback tran
print '事务已回滚'
end
else
begin
commit tran
print '事务已提交' 
end我是原意是想select,insert,update中任一句出错都会回滚事务,但是如果错误发生不是在最后一句的话,错误后面正确的SQL语句就会执行,不会要在每一个SQL语句后面去if吧?还是根本另有方法?请指教,谢谢了!附结果
(所影响的行数为 20 行)服务器: 消息 2627,级别 14,状态 1,行 1
违反了 PRIMARY KEY 约束 'PK_tb10'。不能在对象 'tb10' 中插入重复键。
语句已终止。(所影响的行数为 1 行)事务已提交

解决方案 »

  1.   

    没一个操作后面都应该有一个@@error判断!片段
    begin tran
    declare @intErrorCode int
    select @intErrorCode = -1;
    update tb1 set column2 = 'X' where column1 = 1; -- 假设这句发生错误,则@@error != 0
    @intErrorCode = @@errorif(@intErrorCode = 0)
    begin
        insert into tb2 values('插入成功',getdate());
        @intErrorCode = @@error
    endif(@intErrorCode = 0)
    begin
        commit tran  -- 如果没有任何错误,则提交
    end
    else
    begin
        rollback tran -- 回滚事务
    end
      

  2.   

    每一个操作后面都应该有一个@@error判断!片段
    begin tran
    declare @intErrorCode int
    select @intErrorCode = -1;
    update tb1 set column2 = 'X' where column1 = 1; -- 假设这句发生错误,则@@error != 0
    select @intErrorCode = @@errorif(@intErrorCode = 0)
    begin
        insert into tb2 values('插入成功',getdate());
        select @intErrorCode = @@error
    endif(@intErrorCode = 0)
    begin
        commit tran  -- 如果没有任何错误,则提交
    end
    else
    begin
        rollback tran -- 回滚事务
    end
      

  3.   

    好像只能是每句加IF 。
    没有TRY语句。
      

  4.   

    INSERT出错 ,但是UPDATE会继续执行的,除非你INSERT后也跟一个IF @@ERROR的判断