如果在执行引发 XACT_ABORT 并将其主体包装在 TRY/CATCH 块中的存储过程期间发生客户端超时,会发生什么情况?
我正在研究一堆通常可以转换为 MWE 的过程,如下所示:
create or alter procedure ##ptx
as
begin try
set xact_abort on
waitfor delay '10:00'
end try
begin catch
declare @xsx int = XACT_STATE()
raiserror('XSX=%d', 16, 10, @xsx) with log, nowait
end catch
我创建了一个测试工具,它以 SA 身份登录服务器,异步调用此类过程,并在 X 秒后但早于延迟结束之前使调用超时。日志中没有新条目,因此看起来发生超时时执行不会进入 CATCH 块。应该是?如果不应该,那么客户端超时会发生什么?
当客户端中止执行时,它通过向 SQL Server发送注意信号来实现。
通过这种方式中止执行会回滚当前语句并完全结束执行。
唯一
XACT_ABORT
影响的是任何打开的事务是否被回滚。您无法在 T-SQL 中捕获或处理注意信号。
https://www.sommarskog.se/error_handling/Part2.html#Attention