1

我们的仓库有一个增量加载例程,它使用 Rowversion 获取 OLTP 数据库中的大部分最新更改。它每 10 分钟运行一次,每天会卡住一到两次。

(NOLOCK)除了包含正在测试的 ROWVERSION 的两个表之外,它从中提取的几乎所有表都有一个提示。(我们只测试两个最新表的更改。其余的可以通过完整的隔夜重新填充来处理。这会带来一些风险,但我们似乎正在侥幸逃脱。)

我猜这个挂起发生在我们在该表中的记录上遇到持久块的地方。看到完全一致性在我们的仓库中并不重要,我想(READPAST)在那些经过行版本测试的表上,并在下次空闲时挑选那些锁定的表。

有没有一种简单的方法可以有效地做到这一点?我有一两个想法,但它们似乎太复杂了,我无法正确理解行版本控制。

本质上,我不介意记录需要 20 分钟而不是 10 分钟才能达到一致性,但我确实介意通过诉诸(NOLOCK)ROWVERSION 敏感表来完全丢失记录的提交版本。

4

1 回答 1

1

如果您想获得这些表中数据的一致状态,则不应使用(NOLOCK).

至于(READPAST),使用它可能会很棘手,因为根据读取时表上存在的锁的性质,您可能会得到一些记录或没有记录,并且您必须以某种方式将其与系统状态相协调你有你的代码。

如果表被更新阻止,我会尝试更好地理解它,看看为什么更新需要这么长时间。如果这是一次大规模更新,也许您应该增加读取数据的超时时间和/或接受您可能无法读取数据的情况。

我不能给出一个可靠的解决方案,这取决于我没有的系统细节。

于 2013-10-28T22:17:23.750 回答