在SQL Server触发器内的存储过程调用是否隐含线程安全和原子?

use*_*633 2 sql sql-server triggers stored-procedures atomic

我有一个SQL Server触发器.说实话,我不太确定触发器是否隐含地跟随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;
Run Code Online (Sandbox Code Playgroud)

谢天谢地,谢谢你的帮助.

补充问题

经过一些回应后,这个问题正在准备中(谢谢).我提前道歉.

我的触发器和随后的存储过程调用是否遵循ACID原则并避免竞争条件和死锁?或者,我是否需要添加到触发器和/或存储过程中以防止竞争条件和死锁?

WPr*_*cht 5

底层操作和触发操作被视为原子.他们都在一次交易中提交.从文档:

触发器和触发它的语句被视为单个事务......

请注意,触发器(以及SP将调用)不会看到触发触发器的表更改.它尚未实现.