Transacciones con el alcance adecuado en procesos almacenados
-
01-07-2019 - |
Pregunta
Supongamos que tengo un procedimiento almacenado que gestiona su propia transacción.
CREATE PROCEDURE theProc
AS
BEGIN
BEGIN TRANSACTION
-- do some stuff
IF @ThereIsAProblem
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
END
Si llamo a este proceso desde una transacción existente, el proceso puede ROLLBACK la transacción externa.
BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION
¿Cómo puedo definir correctamente el alcance de la transacción dentro del procedimiento almacenado, de modo que el procedimiento almacenado no revierta las transacciones externas?
Solución
La sintaxis para hacer esto probablemente varía según la base de datos.Pero en Transact-SQL lo que haces es marcar @@TRANCOUNT para ver si estás en una transacción.Si es así, entonces desea crear un punto de guardado y, al final, puede simplemente pasar por el final de la función (creyendo que se realizará una confirmación o una reversión más adelante) o retroceder a su punto de guardado.
Consulte la documentación de Microsoft sobre puntos de guardado para más.
El soporte para puntos de guardado está bastante extendido, pero creo que el mecanismo (suponiendo que exista uno) para descubrir que estás actualmente en una transacción variará bastante.
Otros consejos
use @@trancount para ver si ya está en una transacción al ingresar