none
sql PROC的问题? RRS feed

  • 问题

  • 一、有一个存储过程A,调用别一个存储过程B;A,B中都有事物,假如B中rollback,那么A 也rollback;

    若A中rollback,那么怎么才能让B中的操作rollback呢?


    大其心,可容天下之物; 虚其心,可受天下之善;
    2011年4月19日 4:59

答案

  • SQL2005以上可用begin try..end try begin catch..end catch控制

     


    CREATE PROCEDURE B
    AS
    BEGIN TRY
    BEGIN TRAN
    
    SELECT 1--SQL...
    
    
    COMMIT TRAN
    RETURN 0
    
    END TRY
    BEGIN CATCH
      ROLLBACK TRAN
      RETURN 1
    END CATCH
    go
    
    CREATE PROCEDURE A
    AS
    BEGIN TRY
    DECLARE @i INT
    EXEC @i=B
    
    IF @i=1
      RAISERROR 50001 N'存儲過程:B出錯'
    
    COMMIT TRAN
    RETURN 0
    END TRY
    BEGIN CATCH
      ROLLBACK TRAN
      RETURN 1
    END CATCH
    
    
    
    
    用SELECT ERROR_MESSAGE()--獲取出錯的信息,也可自定義


    ROY WU(吳熹)
    • 已建议为答案 Ai-hua Qiu 2011年4月19日 7:21
    • 已标记为答案 Ai-hua Qiu 2011年4月26日 2:50
    2011年4月19日 5:10
    版主

全部回复

  • 一、有一个存储过程A,调用别一个存储过程B;A,B中都有事物,假如B中rollback,那么A 也rollback;

    若A中rollback,那么怎么才能让B中的操作rollback呢?


    大其心,可容天下之物; 虚其心,可受天下之善;

    用Return控制


    以SQL2000為例

     


    CREATE PROCEDURE B
    AS
    BEGIN TRAN
    
    SELECT 1--SQL...
    
    IF @@ERROR<>0
      GOTO ERROR
    
    COMMIT TRAN
    RETURN 0
    
    ERROR:
      ROLLBACK TRAN
      RETURN 1
    
    go
    
    CREATE PROCEDURE A
    AS
    BEGIN TRAN
    DECLARE @i INT
    EXEC @i=B
    
    IF @i=1
    GOTO ERROR
    
    COMMIT TRAN
    RETURN 0
    
    ERROR:
      ROLLBACK TRAN
      RETURN 1
    
    
    
    


    ROY WU(吳熹)
    2011年4月19日 5:07
    版主
  • SQL2005以上可用begin try..end try begin catch..end catch控制

     


    CREATE PROCEDURE B
    AS
    BEGIN TRY
    BEGIN TRAN
    
    SELECT 1--SQL...
    
    
    COMMIT TRAN
    RETURN 0
    
    END TRY
    BEGIN CATCH
      ROLLBACK TRAN
      RETURN 1
    END CATCH
    go
    
    CREATE PROCEDURE A
    AS
    BEGIN TRY
    DECLARE @i INT
    EXEC @i=B
    
    IF @i=1
      RAISERROR 50001 N'存儲過程:B出錯'
    
    COMMIT TRAN
    RETURN 0
    END TRY
    BEGIN CATCH
      ROLLBACK TRAN
      RETURN 1
    END CATCH
    
    
    
    
    用SELECT ERROR_MESSAGE()--獲取出錯的信息,也可自定義


    ROY WU(吳熹)
    • 已建议为答案 Ai-hua Qiu 2011年4月19日 7:21
    • 已标记为答案 Ai-hua Qiu 2011年4月26日 2:50
    2011年4月19日 5:10
    版主
  • 对于嵌套事务,如果回滚外部事务,也将回滚所有内部事务,不管是否单独提交过内部事务。

    使用没有事务名称的 ROLLBACK TRANSACTION 语句将回滚所有嵌套事务。

    A调用B,那么A中的事务是外部的,B中的事务是内部的。

    详情请参见联机丛书中的嵌套事务。


    想不想时已是想,不如不想都不想。
    2011年4月19日 6:53
    版主