【发布时间】:2017-10-18 03:01:07
【问题描述】:
我有一个 3 层应用程序,并在客户端缓存了数据,因此我需要知道服务器上的数据何时更改以保持缓存同步。
所以我在表格中添加了一个“lastmodification”字段,并在数据更改时更新此字段。但是,如果子行(使用 FK)被修改,必须更新一些“父”最后修改行。
从主表中获取 MAX(lastmodification),从相关表中获取 MAX,然后这几个值的 MAX 正在工作,但有点慢。
我的意思是:
MAX(MAX(MAIN_TABLE), MAX(CHILD1_TABLE), MAX(CHILD2_TABLE))
所以我切换并添加了一个触发器到这个表,以便它更新 TBL_METADATA 表中的一个字段:
CREATE TABLE [TABLE_METADATA](
[TABLE_NAME] [nvarchar](250) NOT NULL,
[TABLE_LAST_MODIFICATION] [datetime] NOT NULL
现在相关表可以通过更新元数据表中的最后修改时间来更新“主”表的最后修改时间。 获取最后的修改现在很快
但是......现在我遇到了与更新此表相关的随机死锁。
这是由于 2 个事务在不同的步骤修改 TABLE_METADATA,然后相互锁定。
我的问题:你有没有办法在不锁定行的情况下保持这个 lastmodification 更新? 就我而言,我真的不在乎:
- 即使事务回滚,lastmodification 也会保持更新
- “脏”最后修改(已更新但尚未提交)是 被新值覆盖
事实上,我真的不需要这些更新在事务中,但由于它们是由触发器执行的,所以它会自动在当前事务中。
感谢您的帮助
【问题讨论】:
-
您是否尝试过使用类似 NOLOCK 的提示?这将在不带任何锁的情况下更新,因此不会导致死锁
-
我知道选择的 NOLOCK 提示,但不知道更新时可以使用?我去查一下,谢谢
-
没关系,我忘了它只适用于 SELECT... 试试看,你会得到:“对于 INSERT、UPDATE、DELETE 或 MERGE 语句的目标表,不允许使用 NOLOCK 和 READUNCOMMITTED 锁定提示。 "
标签: sql sql-server database-deadlocks