Вопрос

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

Это было полезно?

Решение

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

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 profiler, и, конечно же, SQL, похоже, завершает вызов транзакцией и должен откатить эту транзакцию обратно по истечении времени ожидания.

Примечание:Этот тест был выполнен с использованием SQL 2005, но я подозреваю, что результаты будут аналогичны в других версиях.

Другие советы

Как заявил Брендан, клиент отправляет сообщение "прервано", и обработка останавливается намертво.Вот так просто.

Однако все гораздо сложнее, чем это...

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

Вот почему SET XACT_ABORT ON (другие вопросы ИТАК , 1, СО2) рекомендуется

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top