大家好:
我的触发器中有一块远程操作,我希望当这块远程操作执行失败时在本地数据库中进行另一个操作,同时不会滚原来对于触发器所在表的DML操作,
于是我在该远程操作之前设置了SAVE TRANSACTION remote,当远程操作失败时Rollback TRANSACTION remote.
但是这样本地事务(触发器默认事务)则无法提升为分布式事务了(报错:无法将此事务提升为分布式事务,因为在此事务中有活动的保存点。)
请问大家有什么好的解决方法?

解决方案 »

  1.   

    你应该在操作之前, 把所有的事务提交掉WHILE @@TRANCOUNT > 0
       COMMIT TRAN;然后再开事务做后面的操作就没问题了
      

  2.   

    当然, 这样做的直接后果也就是, 如果你在触发器发使用了事务, 则无法在外面 ROLLBACK 之前的操作的
      

  3.   

    分布式事务的问题参考
    http://topic.csdn.net/u/20090109/12/23667bef-de1f-455f-94d4-759c0d20b640.html?seed=1998397327
      

  4.   


    我试过提交触发器本身的事务,然后另启一个新事务的方式。
    但是报错:“其他会话正在使用事务的上下文。”
    我的代码如下:......
    WHILE @@TRANCOUNT > 0
       COMMIT TRAN;
    BEGIN TRAN
    INSERT INTO [192.168.100.89].aaa.dbo.BBB(ID) values(1) --192.168.100.89不连通(即该句会失败)

    IF @@Error <> 0 
    BEGIN 
    ROLLBACK TRAN
    print 'error'
    END
    COMMIT TRAN
    END并且未打印出error
      

  5.   

    不是不通过,就是执行的时候会插入失败(导致@@Error<>0),我是故意让它执行远程插入语句时失败的,为了测试网路不通的时候的执行状况。
    就是希望执行回滚事务,然后执行个本地操作(这里是打印error)。
    可是在执行的时候却报:“其他会话正在使用事务的上下文。”并且未打印出error,这点我不太明白。