gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:49:41 31 4
gpt4 key购买 nike

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com