2016-06-27 23 views
2

は省略しないで必要な部品と私のストアドプロシージャのシェルです:EXECUTEの後のトランザクション数は、一致しない数のBEGINおよびCOMMIT文を示します。間違った場所でコミットしますか?ここ

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE procedure --name of sproc 
    --declare sproc params 
AS 
BEGIN 
    SET XACT_ABORT ON 
    SET NOCOUNT ON 
    BEGIN TRY 
     BEGIN TRANSACTION 

      --declare a few vars 

     --declare some table variables 

      --do some work 
      IF (--some condition here) 
     BEGIN 
     --actually do the work 
      END 
      ELSE 
      BEGIN 
       ROLLBACK TRANSACTION 
       SET @error = 'some value cannot be NULL' 
       RAISERROR(@error, 16, 1) 
       RETURN @error 
      END 
     COMMIT 
    END TRY 
    BEGIN CATCH 
     ROLLBACK TRANSACTION 
     SELECT @error = ERROR_NUMBER() 
      , @message = ERROR_MESSAGE() 
      , @severity = ERROR_SEVERITY() 
      , @state = ERROR_STATE() 

     RAISERROR(@message, @severity, @state) 
     RETURN @error 
    END CATCH 
END 
GO 

私は「--actuallyやるいくつかの作業」に(この記事の主題ではない)、デッドロックエラーを取得していますそして、 "Transaction count ..."エラーがスローされます。

COMMITは間違った場所にありますか?

答えて

1

Begin TransactionBegin Tryの上に移動します。 tryが失敗してキャッチにジャンプした場合、tryで初期化されたものはすべてスコープから外れます。 try/catchの範囲外のトランザクションを開始すると、tryブロックとcatchブロックの両方で使用できるようになります。

+0

ありがとうございます。これは完璧な意味合いがあり、 – crackedcornjimmy

関連する問題