BEGIN TRANSACTION
insert table1--这一句OK
insert table2--执行这一句出错
IF @@ERROR>0
BEGIN
ROLLBACK
END
ELSE    
COMMIT
--但最后,table2插入失败,table1却成功了!BEGIN TRY
insert table1--这一句OK
insert table2--执行这一句出错
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
--据论坛的大虾说不要用事务,用try..catch,但还是不行啊,还是table2失败,但table1的插入并没有回滚

解决方案 »

  1.   

    orz,事务要用,是结合try catch用
    BEGIN TRY
       begin tran
       insert table1
       insert table2
       commit
    END TRY
    BEGIN CATCH
      ROLLBACK
    END CATCH
      

  2.   

    在你的整个事务上加上一句话:set xact_abort on   
      

  3.   

    事务的一致性开关也要打开set xact_abort on 默认是关闭的,关闭的话是不会回滚成功操作的
      

  4.   

    Alter PROCEDURE SPAddDataToUserInfo AS
    BEGIN
        BEGIN TRY
            BEGIN TRANSACTION                -- SET NOCOUNT ON added to prevent extra result sets from
                    -- interfering with SELECT statements.
                    SET NOCOUNT ON;                -- Hard code inserted data.
                    INSERT INTO UserInfo VALUES('JKhuang', 8);
                    INSERT INTO UserInfo VALUES('Jackson', 20111111);
                    INSERT INTO UserInfo VALUES('JKRush', 23);        COMMIT TRANSACTION    END TRY
        BEGIN CATCH        ROLLBACK TRANSACTION    END CATCH
        
    END
    GO
      

  5.   

    参考http://www.cnblogs.com/rush/archive/2011/12/11/2284262.html楼主看看就明白了
      

  6.   

    e.g.declare @error intBEGIN TRANSACTIONinsert table1--这一句OK
    set @error=@@errorinsert table2--执行这一句出错
    set @error=@@errorIF @error=0
    BEGIN
       commit
    END
    ELSE    
    begin
       rollback
    end
      

  7.   

    修正下:
    begin tran
     
    insert table1--这一句OK
    if @@Error <>0 goto ExitErr
     
    insert table2--执行这一句出错
    if @@Error <>0 goto ExitErrcommit 
    goto ExitFlagExitErr:
    rollbackExitFlag: