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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top