C# の TransactionScope のタイムアウトの設定方法
C# の TransactionScope のタイムアウト
前回、こちらの記事で 「TransactionScope(トランザクションスコープ)の使い方 」 を説明しました。
基本的に長い処理をトランザクションとして実行すると、他のトランザクションをブロックしますので、なるべく長くならないようにしたほうが良いとおもいます。
ですが、時には仕方がない時もありますよね。
TransactionScope にもタイムアウトがあり、ConnectionTimeout や CommandTimeout を伸ばしていても、TransactionScope のタイムアウトの時間になると、Transaction Timeout のエラーになって、トランザクションが強制終了されてしまいます。
デフォルトの TransactionScope タイムアウトは 60 秒です。
試しに、uspTest というストアードプロシージャーに WAITFOR DELAY で 1 分 5 秒 スリープさせるようにしておきます。
そして、C# から CommandTimeout を 120 秒にして実行すると、1 分ちょっとで次のようにトランザクションタイムアウト(Transaction Timeout)になります。
という訳で、今回は TransactionScope のタイムアウトの設定方法をご紹介します。
TransactionScope のタイムアウトの設定方法
トランザクションタイムアウトの設定方法のひとつは、TransactionScope のオブジェクトを生成する際にコンストラクターでタイムアウトを指定することです。
タイムアウト値を受け取るコンストラクターは何個かありますが、タイムアウトだけを指定したいので次のコンストラクターを使います。
TransactionScope(TransactionScopeOption, TimeSpan)
TransactionScopeOption には default の Required を指定しておきます。
トランザクションスコープのタイムアウトを 120 秒に設定する場合、コードは次のようになります。
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(120)))
catch セクションには来ず、uspTest の実行が成功しました。