6

SqlCommand を使用してストアド プロシージャを実行し、SqlCommand がタイムアウトした場合、StoredProc は引き続き実行されますか、それとも SqlCommand が切断されたときに強制終了されますか?

4

2 に答える 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これが(他の質問SO1SO2 ) が推奨される理由です。

于 2009-11-11T19:29:46.447 に答える