我们的仓库有一个增量加载例程,它使用Rowversion来获取OLTP数据库中的大部分最新更改。它每10分钟运行一次,每天卡住一次或两次。
除了包含正在测试的ROWVERSIONs的两个表外,几乎所有从中提取的表都有一个(NOLOCK)
提示。 (我们只是测试两个最新表格的变化。其余的可以通过整个隔夜重新人口来处理。这带来了一些自己的风险,但我们似乎正在逃避它。)
我猜这个挂起发生在我们在该表中的记录上遇到持久块的地方。在我们的仓库中看到总体一致性并不重要我想在那些经过rowversion测试的表格上(READPAST)
,并在下一次空闲时选择那些被锁定的表格。
有一种简单的方法可以有效地做到这一点吗?我有一两个想法,但对我来说,它们似乎太复杂了,无法正确理解行版本。
基本上,我不介意记录花费20分钟来达到一致性而不是10但是我确实想通过在ROWVERSION敏感表上使用(NOLOCK)
来完全错过记录的提交版本。
答案 0 :(得分:1)
如果要在这些表中获得一致的数据状态,则不应使用(NOLOCK)
。
对于(READPAST)
,使用它可能会很棘手,因为根据桌面上存在的锁的性质,当你阅读它时,你可能得到一些或没有记录,你将不得不以某种方式将其与您代码中的系统状态进行协调。
如果表被更新阻止,我会尝试更好地理解它,并了解为什么更新应该花费这么长时间。如果这是一次大规模的更新,也许你应该只是增加读取数据的超时和/或接受你不时读取它的时间。
我无法提供可靠的解决方案,这取决于我没有的系统细节。