使用SQL SNAPSHOT ISOLATION,是否可以仅更新非锁定行?

时间:2011-08-03 21:19:38

标签: sql sql-server tsql transactions snapshot-isolation

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

我希望优先级较低的事务更新当前未锁定的所有行。有谁知道我怎么能得到这种行为?另一个SNAPSHOT ISOLATION事件一旦发生冲突就会失败,还是会在失败之前更新所有内容?

使用try-catch SET DEADLOCK_PRIORITY LOW可以提供任何帮助吗?也许在一个WHERE的重试循环中,它仅定位尚未更新的行?

2 个答案:

答案 0 :(得分:2)

快照隔离并不真正起作用;乐观锁定模型意味着它在准备写入/提交之前不会检查锁定或冲突。您也无法设置查询“优先级”本身,也不能在更新时使用READPAST提示。

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

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

如果您期望经常发生碰撞,那么尝试捕获几乎是必需的。

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

答案 1 :(得分:0)

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