小编典典

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

sql

我有一个SQL Server触发器。老实说,我不确定触发器是否隐式地跟在ACIDAtomicity, 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原则,并避免出现竞争情况和死锁?或者,是否需要在触发器和/或存储过程中添加某些内容以防止出现竞争情况和死锁?


阅读 178

收藏
2021-04-28

共1个答案

小编典典

基础操作和触发操作被视为原子操作。他们都承诺一次交易。从文档中

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

请注意,触发器(和SP将被调用)不会看到触发触发器的表更改。它尚未承诺。

2021-04-28