C# の TransactionScope のタイムアウトの設定方法

C# の TransactionScope のタイムアウト

前回、こちらの記事で 「TransactionScope(トランザクションスコープ)の使い方 」 を説明しました。

基本的に長い処理をトランザクションとして実行すると、他のトランザクションをブロックしますので、なるべく長くならないようにしたほうが良いとおもいます。

ですが、時には仕方がない時もありますよね。

TransactionScope にもタイムアウトがあり、ConnectionTimeout や CommandTimeout を伸ばしていても、TransactionScope のタイムアウトの時間になると、Transaction Timeout のエラーになって、トランザクションが強制終了されてしまいます。


デフォルトの TransactionScope タイムアウトは 60 秒です。

試しに、uspTest というストアードプロシージャーに WAITFOR DELAY で 1 分 5 秒 スリープさせるようにしておきます。

C# の TransactionScope のタイムアウトの設定方法 1

そして、C# から CommandTimeout を 120 秒にして実行すると、1 分ちょっとで次のようにトランザクションタイムアウト(Transaction Timeout)になります。

C# の TransactionScope のタイムアウトの設定方法 2

という訳で、今回は TransactionScope のタイムアウトの設定方法をご紹介します。


TransactionScope のタイムアウトの設定方法

トランザクションタイムアウトの設定方法のひとつは、TransactionScope のオブジェクトを生成する際にコンストラクターでタイムアウトを指定することです。

タイムアウト値を受け取るコンストラクターは何個かありますが、タイムアウトだけを指定したいので次のコンストラクターを使います。

TransactionScope(TransactionScopeOption, TimeSpan)

TransactionScopeOption には default の Required を指定しておきます。


トランザクションスコープのタイムアウトを 120 秒に設定する場合、コードは次のようになります。

using (TransactionScope scope =
       new TransactionScope(TransactionScopeOption.Required, 
                            TimeSpan.FromSeconds(120)))

C# の TransactionScope のタイムアウトの設定方法 3

catch セクションには来ず、uspTest の実行が成功しました。

© 2024 C# 入門