我有一个包含约250万条记录的表,并且将更新其中的约70万条记录,并且希望在更新这些记录的同时仍允许其他用户查看数据。我的更新语句如下所示:
UPDATE A WITH (UPDLOCK,ROWLOCK)
SET A.field = B.field
FROM Table_1 A
INNER JOIN Table2 B ON A.id = B.id WHERE A.field IS NULL
AND B.field IS NOT NULL
我想知道是否有什么办法可以解决sql server在什么时候升级对update语句的锁定(因为我不希望整个表都被锁定)?
我没有运行服务器跟踪的权限来查看如何应用锁,因此是否还有其他方法可以知道锁将在什么时候升级为覆盖整个表?
谢谢!
最佳答案
According to BOL一旦该语句在一个对象的单个实例上获得了5,000行或页面级别的锁,便会尝试升级这些锁。如果由于另一个事务具有冲突的锁而导致此尝试失败,则它将在每获得额外的1,250个锁之后再次尝试。
我不确定您是否真的可以将这些数字视为福音,或者是否还有其他一些微妙之处(我想您总是可以在任意数量的锁上达到实例的内存限制)
关于sql - 确定锁升级的阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4679222/