Mantén la atención ya que en este escrito hallarás el hallazgo que buscas.Esta sección fue evaluado por nuestros especialistas para garantizar la calidad y veracidad de nuestro contenido.
Siempre hay que comprobar XACT_STATE()
irrelevante para el XACT_ABORT
ajuste. Tengo un ejemplo de una plantilla para procedimientos almacenados que necesitan manejar transacciones en el contexto TRY/CATCH en Manejo de excepciones y transacciones anidadas:
create procedure [usp_my_procedure_name]
as
begin
set nocount on;
declare @trancount int;
set @trancount = @@trancount;
begin try
if @trancount = 0
begin transaction
else
save transaction usp_my_procedure_name;
-- Do the actual work here
lbexit:
if @trancount = 0
commit;
end try
begin catch
declare @error int, @message varchar(4000), @xstate int;
select @error = ERROR_NUMBER(),
@message = ERROR_MESSAGE(),
@xstate = XACT_STATE();
if @xstate = -1
rollback;
if @xstate = 1 and @trancount = 0
rollback
if @xstate = 1 and @trancount > 0
rollback transaction usp_my_procedure_name;
raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
end catch
end
Hay algunos malentendidos en la discusión anterior.
Primero, siempre puede ROLLBACK una transacción… sin importar el estado de la transacción. Por lo tanto, solo tiene que verificar XACT_STATE antes de COMMIT, no antes de una reversión.
En cuanto al error en el código, querrá colocar la transacción dentro de TRY. Luego en tu CATCH, lo primero que debes hacer es lo siguiente:
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION @transaction
Luego, después de la declaración anterior, puede enviar un correo electrónico o lo que sea necesario. (FYI: si envía el correo electrónico ANTES de la reversión, definitivamente recibirá el error “no se puede… escribir en el archivo de registro”).
Este problema fue del año pasado, así que espero que ya lo hayas resuelto 🙂 Remus te indicó la dirección correcta.
Como regla general… TRY saltará inmediatamente a CATCH cuando haya un error. Luego, cuando esté en CATCH, puede usar XACT_STATE para decidir si puede comprometerse. Pero si siempre desea RETROCEDER en la captura, entonces no necesita verificar el estado en absoluto.
Te mostramos reseñas y valoraciones
Tienes la posibilidad dar recomendación a este escrito si te fue de ayuda.