SQL数据库触发线程安全?

Rya*_*yan 6 database sql-server concurrency multithreading triggers

我一直在想关于SQL Server数据库触发器的并发语义.我有一个数据库触发器,在更新表后运行.触发器将"dateModified"列设置为当前时间.这使我始终知道表的最新更新发生在X时.下面是它的样子:

ALTER TRIGGER base.TR_myTrigger ON base.myTable
  AFTER INSERT, UPDATE AS
BEGIN
    DECLARE @dateModified AS DATETIMEOFFSET

    SET @dateModified = SYSDATETIMEOFFSET()
    UPDATE base.myTable
    Set dateModified =  @dateModified
    WHERE id in (SELECT DISTINCT(id) FROM inserted)
END
Run Code Online (Sandbox Code Playgroud)

在我的场景中,表可以随时由任意数量的线程更新.这个触发器在多线程环境中是否安全?如果线程A更新了表,并且线程B在之后立即从中读取,那么B是否会看到具有A更新但没有触发更新的表的状态?或者触发器是否保护表不被读取,直到执行了所有操作+其触发器?

任何洞察使用SQL数据库触发器在幕后发生的事情都将受到赞赏.谢谢!

Ben*_*hul 3

如果线程 A 更新表,而线程 B 随后立即读取该表,那么 B 是否会看到包含 A 更新但不包含触发器更新的表状态?或者触发器是否会保护表不被读取,直到所有操作及其触发器都已执行?

这归结为:底层操作和触发操作是否被视为一个原子单元,还是分开的?答案是:原子。也就是说,您永远不会看到插入或更新的结果(在您的情况下),也不会看到通过触发器处理的 dateModified 列。也就是说,它们都在一笔事务中提交。从文档中:

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