2017-06-05 103 views
1

SQL Server 2014を使用しています。私のストアドプロシージャはネストされたトランザクションプロシージャであり、それによってトランザクションを持つストアドプロシージャはほとんどコールされません。内部ストアドプロシージャのいずれかがエラーをヒットした場合、その後、私はトランザクションを開けませんでしたが場合、などSQL Serverストアドプロシージャのネストされたトランザクション

Begin Try 
Begin Tran 
    Exec Stored Proc 1 (with begin tran inside) 
    Exec Stored Proc 2 (with begin tran inside) 
    Exec Stored Proc 3 (with begin tran inside) 
    Exec Stored Proc 4 (with begin tran inside) 
    Exec Stored Proc 5 (with begin tran inside) 
Commit Tran 
End Try 
Begin Catch 
    Catch exception then roll back tran 
End Catch 

問題はトランザクション数が後に内部のストアドプロシージャが一致しない実行され、すべてロールバックされます内部ストアドプロシージャでは、ロールバックされません。誰も私にいくつかの提案を与えることができますか?

+0

各手順の中にtry catchを使用してください。トランザクションを内部プロシージャでロールバックし、エラーを外部プロシージャに戻します。外側のprocでは、内側のprocからエラーが発生し、各トランザクションを呼び出すサイクルが壊れ、 – scsimon

+0

こんにちは@scsimon、あなたの提案に感謝します。 たとえば、ストアproc 1と2が正常に実行されたが、ストアされたproc 3ヒットエラーが発生したとします。だから外側のキャッチとロールバックは、proc 1と2のストアド・プロシージャをロールバックします。 –

答えて

1

内部トランザクションのコミットは、SQL Serverデータベースエンジンによって無視されます。トランザクションは、最も外側のトランザクションの最後に実行されたアクションに基づいてコミットまたはロールバックされます。外側のトランザクションがコミットされている場合、内側のネストされたトランザクションもコミットされます。

Nesting Transactions

+1

これで動作します。私は内側のトランザクションを削除し、try catchを使用します。したがって、内部ストアドプロシージャのエラーが発生した場合、外部トランザクションはすべてをロールバックします –

関連する問題