比如:
事物1 START          事物2 START     插入一张表     事物2 END          然后程序崩掉,事物1回滚,不过又想提交事物2的数据。
事物1 END有办法实现吗

解决方案 »

  1.   

    可以在一个显式事务中包含另一个显式事务(事务嵌套)。在显示事务中,每执行一个 BEGIN TRAN 语句都会开始一个新的事务,事务数都会加 1;每执行一个 COMMIT TRAN 语句事务数都会减 1,但是只有最外层嵌套的 COMMIT TRAN 语句才会真正提交在它之前的所有事务,而在其他各层嵌套上的 COMMIT TRAN 语句并不真正提交本嵌套的事务;无论在哪一层事务上执行一个 ROLLBACK TRAN 语句都会回滚在它之前的所有事务,事务数为 0。可以在事务中使用 SAVE TRAN 语句,实现部分回滚事务——在显示事务中的特定位置添加 SAVE TRAN savepoint 语句,在需要时可以使用 ROLLBACK TRAN savepoint 语句将事务回滚到 savepoint 位置。
      

  2.   

    事务是可以嵌套的begin tran
    begin tran 
    select * from sysobjects
    commit tran
    select 1/0
    commit tran
      

  3.   

    KG兄
    可不可以再事务2 的下面设置一个 SAVE 把事务1的回滚到save
      

  4.   


    可以
    但回滚到save时,整个事务还处於未提交状态(@@trancount未改变),要再发出一个commit /rollback 事务才算完成。所以我说 "事物1回滚,事物2肯定会回滚"
      

  5.   

    save trans 可以处理这样的问题!
      

  6.   

    事物1 START     事物2 START     插入一张表     事物2 END      事物1 END 这样的才能实现,首先回滚到事务2end那里,然后再次commit,事务1开始和事务2开始之间不能有任何语句