1. ホーム
  2. sql-server

[解決済み] try catch ブロックで @@trancount > 0 を確認する必要があるのはどのような場合ですか?

2022-02-04 16:08:49

質問

時々、次のようなコード・スニペットを見かけます。このとき if @@trancount > 0 が必要です。 begin try ? 両方ですか?それとも、チェック前にロールバックされることを想定して、常にチェックするのが安全な方法(ベストプラクティス)なのでしょうか?

begin tran
begin try
  ... just several lines of sql ...
  if @@trancount > 0 commit tran
end try
begin catch
  if @@trancount > 0 rollback tran
end catch

解決方法は?

を扱う場合、いくつかのシナリオを考えることができます。 @@trancount :

  1. 現在のトランザクションが別のストアドプロシージャから呼び出され、そのストアドプロシージャが 独自のトランザクション
  2. 現在のトランザクションが、独自のメソッドを持つ .NET コードによって呼び出された。 トランザクション
  3. 現在のトランザクションが唯一のトランザクションである

私は、Remus Rusanuの 例外処理とネストされたトランザクション は、これらの可能性をすべて処理します。