transacciones - ¿Es una llamada a procedimiento almacenado dentro de un desencadenador de SQL Server implícitamente segura y atómica?
sql server @@ error example (1)
La operación subyacente y la operación desencadenante se tratan como atómicas. Ambos se comprometen en una transacción. De la documentación :
El desencadenante y la declaración que lo desencadena se tratan como una transacción única ...
Tenga en cuenta que el desencadenador (y el SP llamará) no verá el cambio de tabla que activó el desencadenador. No se ha comprometido todavía.
Tengo un disparador de SQL Server. Para ser sincero, no estoy seguro si los desencadenantes siguen implícitamente a ACID
( Atomicity, Consistency, Isolation, Durability
), pero mi desencadenante, por el momento, no hace nada particularmente complejo.
Ahora, quiero llamar a un procedimiento almacenado desde el disparador. Tengo TRANSACTION
rodeando la llamada al procedimiento almacenado y una INSERT
.
Mi pregunta es: si un desencadenador, sin una llamada a procedimiento almacenado, es seguro para hilos y atómico, al menos en parte debido a la TRANSACTION
, ¿la llamada al procedimiento almacenado será implícitamente segura y atómica?
Esto es lo que parece el gatillo:
CREATE TRIGGER [triggerInsert_Foobar]
ON [Foobar]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
-- Turns on rollack if T-SQL statement raises a run-time error
SET XACT_ABORT ON
-- Start new transaction
BEGIN TRANSACTION
-- Insert statement for trigger
INSERT INTO Foo ( Col1, Col2 )
SELECT
RTRIM ( LTRIM ( Col1 ) ),
Col2
FROM
INSERTED
-- Call stored procedure (takes no parameters)
EXECUTE sp_executesql N''FoobarApp_DoSomething''
-- Complete transaction
COMMIT TRANSACTION
END;
Gracias, amablemente, por su ayuda.
Pregunta adicional
Esta pregunta se está preparando después de algunas respuestas ya (gracias). Me disculpo de antemano.
¿Mi desencadenante y la posterior llamada del procedimiento almacenado siguen el principio ACID y evitan las condiciones de carrera y los puntos muertos? O, ¿hay algo que deba agregar a mi desencadenante y / o al procedimiento almacenado para salvaguardar contra las condiciones de carrera y los bloqueos?