我有一个名为_Test的表,其中存储了以下值。
主键: Id

我还在那张桌子上设计了一个触发器
ALTER Trigger [dbo].[_Test_Data_Save]
On [dbo].[_Test]
For Insert
As
--Some custom algorithm which takes about 2-3 seconds to complete现在,3条记录被保存在同一微秒内的3个不同的会话中,如下图所示。

现在我的问题是,最后3项记录的触发器将如何工作?最后三个记录会触发三个不同的触发器吗?
如果没有一个一个地执行触发器,那么我能做什么,以便他们首先为Id=5记录执行触发器,然后在完成该Id=6之后,然后为Id=7执行触发器。
发布于 2018-10-13 14:20:56
触发器代码在调用它的事务的范围内执行。正如您所述,这三条记录中的每一条都是由单独的会话插入的,这意味着完成了三个不同的事务,每个事务都插入了一个记录并执行了该记录的触发代码。
如果“同时”启动三个(或更多)事务,则无法控制执行事务的各个部分在设置事务隔离级别之后的执行顺序。如果隔离级别设置为可序列化,则触发器代码将逐个执行“(根据保存的顺序)”;否则,它似乎会“按SQL似乎合适的任意随机顺序运行”,这取决于每个事务所获得的任何锁。
发布于 2018-10-13 09:04:31
警告:由于我没有足够的声誉,我不能写评论,这是一个评论。
AFAIK SQL server仅对每个语句触发器具有。这意味着触发器将同时修改行。
如果要更新每一行,一个解决方案是使用游标,而游标是性能的杀手。也许更有技能的人有更好的方法。
https://dba.stackexchange.com/questions/220001
复制相似问题