このように見てみてください:
トランザクションの長さは、trans.Complete()を呼び出すか、トランザクションスコープを終了するときにのみ決定されます。次のコードを取ります:
using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}
スリープルーチン内でタイムアウト例外をスローする方法はありません。スローしたとしても意味がありません。したがって、トランザクションのタイムアウトを(少なくともこの方法で)使用すると、トランザクションにタイムアウトよりも時間がかかる場合にのみ、トランザクションがコミットされないことが保証されます。
1つのクエリを実行しているだけの場合(トランザクションを何に使用するのかわかりません)、クエリ/コマンドのタイムアウト(またはそれを呼び出すもの)を設定できます。 IIRC、タイムアウトが経過するとすぐにクエリが返されます。
もう1つの方法は、Webサービス要求のタイムアウトを設定し、トランザクション内にあるものが原因でWebサービスが応答するのに時間がかかりすぎると想定することです。
編集:あなたは試すことができます:
- 別のスレッドでトランザクションを生成し、メインスレッド(Webサービス呼び出しで使用されるスレッド)でトランザクションが完了するのを待ちます(Thread.Join(timeout)を使用)。したがって、指定したタイムアウトの前に終了しない場合は、待機を停止してタイムアウトエラーを返す可能性があります(トランザクションを中止するように他のスレッドに通知することを忘れないでください)。
- これらのトランザクション内でのみSQLクエリを実行していると仮定すると、「BEGIN TRANSACTION」キーワードを使用して、SQLスクリプトでトランザクションを指定できます(確かにハッキーです)。次に、コマンドタイムアウトを指定して、これらすべてを1行のコードで実行できます。ただし、これには、トランザクション内で行うすべてのことをSQLスクリプトに移動する必要があります。これは、実行できる場合とできない場合があります...そしてそれはクリーンではありません。