我有许多通过我的应用程序更新的表,它们返回大量数据或难以查询更改。为了解决这个问题,我创建了一个带有单行的“LastUpdated”表,并在这些复杂表上设置了一个触发器,它只针对 LastUpdated 表中的相应列设置 GetDate():
CREATE TRIGGER [dbo].[trg_ListItem_LastUpdated] ON [dbo].[tblListItem]
FOR INSERT, UPDATE, DELETE
AS
UPDATE LastUpdated SET ListItems = GetDate()
GO
这样,客户端只需查询该表的最后更新值,然后就可以决定是否需要从复杂表中刷新数据。复杂表使用快照隔离来防止脏读。
在繁忙的系统中,由于“LastUpdated”中的更新冲突,我们每天大约会遇到一次在复杂表中写入或更新数据的错误。因为这发生在触发器执行的语句中,所以受影响的复杂表无法保存数据。记录以下错误:
由于更新冲突,快照隔离事务中止。您不能使用快照隔离直接或间接访问数据库“devDB”中的表“dbo.tblLastUpdated”来更新、删除或插入已被另一个事务修改或删除的行。重试事务或更改更新/删除语句的隔离级别。
我应该在触发器中做什么来防止这种失败?我可以在触发器上使用某种查询提示来避免这种情况 - 还是我可以忽略触发器中的错误?更新 LastUpdated 中的数据并不重要,但将数据正确保存到复杂表中才是关键。
这可能是我忽略或不知道的非常简单的事情。一如既往,感谢您提供任何信息。