SqlCommand を使用してストアド プロシージャを実行し、SqlCommand がタイムアウトした場合、StoredProc は引き続き実行されますか、それとも SqlCommand が切断されたときに強制終了されますか?
2281 次
2 に答える
3
私の本能は、手順がまだ実行されると言ったので、簡単なテストをまとめました。
SQL:
Create Procedure TestDelay
AS
waitfor delay '00:00:40'
update table_1
set dt = getdate()
VB.Net では (この目的では C# と同じ):
Dim con As New SqlConnection(myconnectionstring)
Dim com As New SqlCommand("TestDelay", con)
com.CommandType = CommandType.StoredProcedure
con.Open()
Try
com.ExecuteNonQuery()
Catch ex As Exception
con.Close()
Response.Write(ex.Message)
End Try
結果? タイムアウト後に手順が完了しませんでした。 SQL プロファイラーでトレース中に何が起こっているかを確認したところ、十分な SQL がトランザクションで呼び出しをラップしているように見え、タイムアウト時にそのトランザクションをロールバックする必要があることを確認しました。
注: このテストは SQL 2005 に対して実行されましたが、結果は他のバージョンでも同様であると思われます。
于 2009-11-11T15:20:33.827 に答える
1
ブレンダンが述べたように、クライアントは「中止」を送信し、処理は完全に停止します。それと同じくらい簡単です。
しかし、それはそれよりも複雑です...
デフォルトではトランザクションはロールバックされず、ロックは接続が閉じられるまでそこに残されます。接続プールに返されて再利用された場合、これはクローズとしてカウントされません。
SET XACT_ABORT ON
これが(他の質問SO1、SO2 ) が推奨される理由です。
于 2009-11-11T19:29:46.447 に答える