0

大型 SQL Server 2008 表通常使用 SNAPSHOT ISOLATION 事务以(相对)较小的块进行更新。快照对于这些更新非常有效,因为这些块永远不会重叠。这些更新不是单个长时间运行的操作,而是按事务分组的许多小的单行插入/更新。

我想要一个较低优先级的事务来更新当前未锁定的所有行。有谁知道我怎么能得到这种行为?另一个 SNAPSHOT ISOLATION 事务会在一行发生冲突时立即失败,还是会在失败前更新所有可能的内容?

SET DEADLOCK_PRIORITY LOWtry-catch 有什么帮助吗?也许在重试循环中WHERE只针对尚未更新的行?

4

2 回答 2

2

快照隔离实际上并不是这样工作的。乐观锁定模型意味着它在准备好写入/提交之前不会检查锁或冲突。您本身也不能设置查询“优先级”,也不能在更新时使用 READPAST 提示。

每个更新都是一个隐式原子事务,因此如果 10 个更新中有 1 个失败(在单个事务中),它们都会回滚。

SET DEADLOCK_PRIORITY 仅设置在发生交易锁时回滚事务的首选项(否则选择“最便宜”的回滚)。

如果您期望定期发生碰撞,则尝试捕获几乎是必需的。

重试循环将像使用不同的锁定模型和 NOWAIT 提示一样工作,以跳过将被阻止的查询。

于 2011-08-03T21:41:44.323 回答
0

SNAPSHOT ISOLATION 事务一旦遇到更新冲突就会失败。但是,我会使用数据库外的一些队列来确定更新的优先级。

于 2011-08-04T02:43:09.567 回答