Тайм-аут хранимых процессов и SqlCommand - PullRequest
6 голосов
/ 11 ноября 2009

Если я запускаю сохраненный процесс с использованием SqlCommand и время ожидания SqlCommand продолжает ли StoredProc выполняться или он принудительно завершает работу при отключении SqlCommand?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2009

Мой инстинкт сказал, что процедура все еще будет выполняться, поэтому я собрал простой тест.

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, но я подозреваю, что результаты будут аналогичными в других версиях.

1 голос
/ 11 ноября 2009

Как заявил Брендан, клиент отправляет «abort» и обработка останавливается. Так просто.

Тем не менее, это сложнее, чем это ...

По умолчанию все транзакции не откатываются, и блокировки просто остаются там до тех пор, пока соединение не будет закрыто. Если он возвращается в пул соединений и используется повторно, то не считается закрытием.

Именно поэтому SET XACT_ABORT ON (другие вопросы SO1 , SO2 ) рекомендуется

...