我有一个SQL Server触发器。老实说,我不确定触发器是否隐式地跟在ACID(Atomicity, Consistency, Isolation, Durability)后面,但是目前,我的触发器没有做任何特别复杂的事情。
ACID
Atomicity, Consistency, Isolation, Durability
现在,我想从触发器中调用存储过程。我已经TRANSACTION围绕存储过程调用和一条INSERT语句。
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原则,并避免出现竞争情况和死锁?或者,是否需要在触发器和/或存储过程中添加某些内容以防止出现竞争情况和死锁?
基础操作和触发操作被视为原子操作。他们都承诺一次交易。从文档中:
触发器和触发它的语句被视为单个事务。
请注意,触发器(和SP将被调用)不会看到触发触发器的表更改。它尚未承诺。