ADO.NETにおける3種類のタイムアウト

ようやっと自分の中で整理できたので(遅!)、ここでまとめてみます。

接続タイムアウト

IDbConnection.Open() の制限時間を設定するものです。接続文字列(秒)で指定します。

Data Source=.\sqlexpress;Integrated Security=SSPI;Connection Timeout=60

コマンドタイムアウト

文字通り、1つのIDbCommandコマンドの制限時間です。IDbCommand.CommandTimeoutプロパティ(秒)で設定します。
私の場合、下記トランザクションタイムアウトの値を秒に変換してそのまま設定するようにしています。

トランザクションタイムアウト

1つのトランザクションの制限時間です。
トランザクションの実装にSystem.Transaction.TransactionScopeを利用することが多いかと思いますが、
その場合に意識する必要があります。

トランザクションタイムアウトは2箇所で設定可能です。

アプリケーション構成ファイル

未設定の場合、既定値は1分です。

<configuration>
 <system.transactions>
  <!-- トランザクションタイムアウトを30秒に短縮  -->
  <defaultSettings timeout="00:00:30" />
 </system.transactions>
</configuration>
TransactionOptions.Timeout (TransactionScopeインスタンス作成時に指定可能)

上記構成と同時に指定した場合、こちらの値が優先されます。


ただし、上記2つの方法ではシステム既定値である10分を超えた値を設定することはできません。
10分を超えた値を指定したい場合は、管理者としてログインしてマシン構成ファイル(machine.config)
以下の要領で設定を行う必要があります。

<configuration>
 <system.transactions>
  <!-- トランザクションタイムアウトを1時間に延長  -->
  <machineSettings maxTimeout="01:00:00" />
 </system.transactions>
</configuration>

結構面倒な仕様ですね...
なお、構成で設定された値はそれぞれTransactionManager.DefaultTimeoutおよびTransactionManager.MaximumTimeoutで取得可能です。