大型SQL Server 2008表通常使用SNAPSHOT ISOLATION事务以(相对)小块更新。快照适用于那些更新,因为块从不重叠。这些更新不是单个长时间运行的操作,而是由事务分组的许多小的单行插入/更新。
我希望优先级较低的事务更新当前未锁定的所有行。有谁知道我怎么能得到这种行为?另一个SNAPSHOT ISOLATION事件一旦发生冲突就会失败,还是会在失败之前更新所有内容?
使用try-catch SET DEADLOCK_PRIORITY LOW
可以提供任何帮助吗?也许在一个WHERE
的重试循环中,它仅定位尚未更新的行?
答案 0 :(得分:2)
快照隔离并不真正起作用;乐观锁定模型意味着它在准备写入/提交之前不会检查锁定或冲突。您也无法设置查询“优先级”本身,也不能在更新时使用READPAST提示。
每次更新都是一个隐式原子事务,因此,如果10个中的1个更新失败(在单个事务中),则它们都会回滚。
SET DEADLOCK_PRIORITY仅设置在交易锁定时回滚哪个事务的首选项(否则选择“最便宜的”回滚)。
如果您期望经常发生碰撞,那么尝试捕获几乎是必需的。
重试循环将使用不同的锁定模型和NOWAIT提示来跳过将被阻止的查询。
答案 1 :(得分:0)
SNAPSHOT ISOLATION事件遇到更新冲突后立即失败。但是,我会使用数据库外部的一些队列来确定更新的优先级。