在我的数据库中,我有两个密切相关的表。 有一个经常被称为SP的事件,它会将某些行插入到事务中的两个表中,而其他几个从这些表中执行SELECT的地方也会连接起来。
INSERT在两个表上都有X锁定,SELECT对它们进行S或IS锁定。由于获取共享锁的顺序因查询而异,因此其中一些偶尔会因INSERT事务而陷入僵局。
有没有什么好方法可以避免这些死锁(NOLOCK可能不符合'好'的标准)?
到目前为止,我能想到的唯一通用解决方案是使用SNAPSHOT隔离级别。但是,它会增加一些性能开销,而且我还没有找到任何关于这个开销有多大的声音数据。
答案 0 :(得分:0)
您是否SP在事务中从这些表中选择或更新任何内容?如果没有,您可以尝试使用 rowlock 提示进行插入和其他选择(行锁通常不会升级为页锁或表锁,除非您在选择结果中有太多行)。如果是,那么您可以在SP事务中尝试 updlock 提示。
答案 1 :(得分:0)
我在系统中使用快照。它不是免费的,这是肯定的,但替代方案也不是免费的 - 阻塞也会占用资源。使用rowlock并不总是有用。 快照还可以为您提供数据的一致时间点快照;否则你会遇到一些微妙的错误。
还有一件事:即使您只有一个表,也可能出现死锁,例如:Reproducing deadlocks involving only one table
答案 2 :(得分:0)