sql-server - SQL数据库触发器线程安全吗?

标签 sql-server database multithreading concurrency 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

在我的场景中,表可以随时被任意数量的线程更新。这个触发器在多线程上下文中安全吗?如果线程 A 更新表,并且线程 B 立即从中读取,B 是否会看到包含 A 更新但未触发更新的表状态?还是触发器会保护表不被读取,直到所有操作及其触发器都已执行?

如能深入了解 SQL 数据库触发器的幕后情况,我们将不胜感激。谢谢!

最佳答案

If thread A updates the table, and thread B reads from it immediately after, will B see a state of the table with A's updates but not trigger's updates too? Or do triggers protect the table from being read from until all actions + their triggers have been performed?

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

The trigger and the statement that fires it are treated as a single transaction...

关于sql-server - SQL数据库触发器线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27534010/

相关文章:

sql - 在聚簇索引上使用顺序 GUID 键的 INSERT 并没有显着加快

mysql - 判断一个点是否在区域内

database - 如何执行以下查询?

c# - EF 代码优先 : Cannot connect to SQL Server

c# - 将 csv 文件从 Azure Blob 插入 Azure SQL

sql-server - 需要帮助在 ColdFusion 中格式化类型 ="datetime-local"(不是冷聚变元素)

database - 微服务:原子事件

java - 如何在 SWT 应用程序中停止自定义 Thead?

c++ - 当线程数增加时,多线程文件 IO 程序的行为不可预测

c# - 如何将多个参数传递给 C# 线程?