gpt4 book ai didi

sql - 由于更新冲突而导致审核表失败的触发器

转载 作者:行者123 更新时间:2023-12-03 02:46:41 25 4
gpt4 key购买 nike

我有许多表通过我的应用程序进行更新,这些表返回大量数据或很难查询更改。为了解决这个问题,我创建了一个包含单行的“LastUpdated”表,并在这些复杂的表上有一个触发器,该触发器仅针对 LastUpdated 表中的相应列设置 GetDate():

CREATE TRIGGER [dbo].[trg_ListItem_LastUpdated] ON [dbo].[tblListItem] 
FOR INSERT, UPDATE, DELETE
AS
UPDATE LastUpdated SET ListItems = GetDate()
GO

这样,客户端只需查询该表以获取最后更新的值,然后就可以决定是否需要刷新复杂表中的数据。复杂的表使用快照隔离来防止脏读。

在繁忙的系统中,由于“LastUpdated”中的更新冲突,我们大约每天都会遇到一次在复杂表中写入或更新数据的错误。由于该问题发生在触发器执行的语句中,因此受影响的复杂表无法保存数据。记录以下错误:

Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table 'dbo.tblLastUpdated' directly or indirectly in database 'devDB' to update, delete, or insert the row that has been modified or deleted by another transaction. Retry the transaction or change the isolation level for the update/delete statement.

我应该在触发器中做什么来防止这种失败?我可以在触发器上使用某种查询提示来避免这种情况 - 或者我可以忽略触发器中的错误吗?更新 LastUpdated 中的数据并不重要,但将数据正确保存到复杂的表中才是关键。

这可能是我忽略或没有意识到的非常简单的事情。一如既往,感谢您提供任何信息。

最佳答案

我想说,您应该考虑使用更改跟踪 (http://msdn.microsoft.com/en-gb/library/cc280462%28v=sql.100%29.aspx),这是一种轻量级的内置 SQL Server 功能,您可以使用它来监视表已更改的事实,而不是记录每个单独的更改(您也可以使用更改数据捕获来完成)。它需要快照隔离,您已经在使用它。

由于您的触发器正在父事务中运行,并且您的快照已过时,因此您的整个事务需要重新开始。如果这是一个复杂的工作负载,那么以这种方式维护最新更新的数据将会非常昂贵。

关于sql - 由于更新冲突而导致审核表失败的触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13169764/

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