使用TSQL SNAPSHOT ISOLATION,是否可以只更新未锁定的行



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

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

SET DEADLOCK_PRIORITY LOW尝试接球有什么帮助吗?也许在WHERE的重试循环中,它只针对尚未更新的行?

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

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

SET DEADLOCK_PRIORITY仅设置在解除锁定时回滚哪个事务的首选项(否则将选择"最便宜"的回滚(。

如果您预计会发生定期碰撞,那么尝试捕获几乎是必需的。

重试循环将使用不同的锁定模型和NOWAIT提示来跳过将被阻止的查询。

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

最新更新