SQL 服务器触发器中的存储过程调用是否隐含线程安全和原子性?
Is a stored procedure call inside a SQL Server trigger implictly thread safe and atomic?
我有一个 SQL 服务器触发器。老实说,我不太确定触发器是否隐含地遵循 ACID
(Atomicity, Consistency, Isolation, Durability
),但我的触发器目前并没有做任何特别复杂的事情。
现在,我想从触发器中调用存储过程。我有 TRANSACTION
围绕存储过程调用和 INSERT
语句。
我的问题是:如果没有存储过程调用的触发器是线程安全的和原子的——至少部分是由于 TRANSACTION
——存储过程调用是否是隐式线程安全和原子的?
这是触发器的样子:
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;
谢谢您的帮助。
补充问题
这个问题是在已经有一些回答(谢谢)之后准备的。我提前道歉。
我的触发器和存储过程的后续调用是否遵循 ACID 原则并避免竞争条件和死锁?或者,我是否需要向我的触发器 and/or 添加一些东西来防止竞争条件和死锁?
底层操作和触发操作被视为原子操作。他们都在一个事务中提交。来自 the documentation:
The trigger and the statement that fires it are treated as a single transaction...
请注意,触发器(SP 将调用)不会看到触发触发器的 table 更改。它还没有提交。
我有一个 SQL 服务器触发器。老实说,我不太确定触发器是否隐含地遵循 ACID
(Atomicity, Consistency, Isolation, Durability
),但我的触发器目前并没有做任何特别复杂的事情。
现在,我想从触发器中调用存储过程。我有 TRANSACTION
围绕存储过程调用和 INSERT
语句。
我的问题是:如果没有存储过程调用的触发器是线程安全的和原子的——至少部分是由于 TRANSACTION
——存储过程调用是否是隐式线程安全和原子的?
这是触发器的样子:
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;
谢谢您的帮助。
补充问题
这个问题是在已经有一些回答(谢谢)之后准备的。我提前道歉。
我的触发器和存储过程的后续调用是否遵循 ACID 原则并避免竞争条件和死锁?或者,我是否需要向我的触发器 and/or 添加一些东西来防止竞争条件和死锁?
底层操作和触发操作被视为原子操作。他们都在一个事务中提交。来自 the documentation:
The trigger and the statement that fires it are treated as a single transaction...
请注意,触发器(SP 将调用)不会看到触发触发器的 table 更改。它还没有提交。