我一直想知道与 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/