Сохраненный тайм-аут процедуры и SqlCommand
-
19-09-2019 - |
Вопрос
Если я запускаю хранимый процесс с использованием 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) рекомендуется