确定锁升级的阈值

Dib*_*tar 4 sql sql-server sql-server-2005

我有一个包含大约 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
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以解决 sql server 在什么时候升级更新语句上的锁(因为我不希望整个表被锁定)?

我没有权限运行服务器跟踪来查看锁是如何应用的,那么有没有其他方法可以知道锁将在什么时候升级以覆盖整个表?

谢谢!

Mar*_*ith 5

根据 BOL,一旦语句在对象的单个实例上获得 5,000 个行或页级锁,就会尝试升级锁。如果此尝试因另一个事务具有冲突锁而失败,则在每获得 1,250 个额外的锁后,它将再次尝试。

我不确定你是否真的可以把这些数字当作福音,或者是否还有比这更微妙的地方(我猜你总是可以在任意数量的锁上达到实例的内存限制)