这是事务栈被清空引起的问题。如果proa出错,事务栈被清空,返回prob时就出错。
1.proa 中不要使用事务,由prob来控制,就好了。2.事务不要嵌套
  ...
  exec @a = proa
  if ...
  ...
  ...
  begin tran t2
  ...
3.使用保存事务,save trans
  ...

解决方案 »

  1.   

    我试过用save trans,但有错误,只能改proa才能做到。但我不想改动ProA,只改成ProB,而且事务要在ProB的一开始处就要有。请给出具体代码。
      

  2.   

    CREATE  procedure ProB --反回1失败,返回0成功
    as
    SET XACT_ABORT ON  --ADD THIS STATEMENT
    begin
    BEGIN TRAN T2
    declare @b int
    set @b=0
    exec @b=ProA 
    if @b=1
    begin
      rollback tran T2
      return 1
    end
    else
    begin
     commit tran T2
     return 0
    end
    end
      

  3.   

    CREATE  procedure ProB --反回1失败,返回0成功
    as
    SET XACT_ABORT ON  --ADD THIS STATEMENT
    begin
    BEGIN TRAN T2
    declare @b int
    set @b=0
    exec @b=ProA 
    if @b=1 and @@error=0
    begin
      rollback tran T2
      return 1
    end
    else
    begin
     commit tran T2
     return 0
    end
    end
      

  4.   

    CREATE  procedure ProB --反回1失败,返回0成功
    as
    SET XACT_ABORT ON  --ADD THIS STATEMENT
    begin
    BEGIN TRAN T2
    declare @b int
    set @b=0
    exec @b=ProA 
    if @b=1 and @@error<>0
    begin
      rollback tran T2
      return 1
    end
    else
    begin
     commit tran T2
     return 0
    end
    end
      

  5.   

    看看这个示例
    SELECT '事务处理前', @@TRANCOUNT      --值为 0
    BEGIN TRAN 
      SELECT '第一个事务', @@TRANCOUNT    --值为 1
        SELECT * FROM table1
      SAVE TRAN t1
      SELECT '保存第一个事务后', @@TRANCOUNT --值为 1 
        BEGIN TRAN 
           SELECT '第二个事务', @@TRANCOUNT  --值为 2
             DELETE table1
       ROLLBACK TRAN t1
        SELECT '回滚到保存点t1', @@TRANCOUNT --注意这里的值为 2 
    IF @@TRANCOUNT>0
    ROLLBACK TRAN
    SELECT '处理结束', @@TRANCOUNT --为 0
      

  6.   

    执行ProA中的rollbacktran 后@@TRANCOUNT为0 所以在proB中无法在回滚事务了
    你看看事务嵌套的例子SELECT '事务处理前', @@TRANCOUNT      --值为 0
    BEGIN TRAN
      SELECT '第一个事务', @@TRANCOUNT    --值为 1
        SELECT * FROM cloth2
        BEGIN TRAN 
           SELECT '第二个事务', @@TRANCOUNT  --值为 2
             DELETE cloth2
        rollback tran
        SELECT '回滚第二个事务', @@TRANCOUNT --值为 0
    --rollback tran  这里不能再用了rollback tran 无论在哪一层使用  @@TRANCOUNT都将清为0
      

  7.   

    SET  XACT_ABORT  ON     不好便。