O que acontece quando ocorre um tempo limite do cliente durante a execução de um procedimento armazenado que gera XACT_ABORT e envolve seu corpo em blocos TRY/CATCH?
Estou analisando vários procedimentos que geralmente podem ser convertidos em um MWE da seguinte maneira:
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
Eu criei um equipamento de teste que efetua login no servidor como SA, chama esse procedimento de forma assíncrona e expira a chamada após X segundos, mas antes que o atraso deva acabar. Não há novas entradas no log, então parece que a execução não entra no bloco CATCH quando ocorre um tempo limite. Deveria? Caso contrário, o que acontece quando o tempo limite do cliente é atingido?
Quando o cliente anula a execução, ele envia um sinal de atenção ao SQL Server.
Abortar a execução dessa forma reverte a instrução atual e encerra a execução completamente.
A única coisa
XACT_ABORT
que afeta é se qualquer transação aberta será revertida ou não.Você não pode capturar ou manipular um sinal de atenção no T-SQL.
https://www.sommarskog.se/error_handling/Part2.html#Attention