如何在Inner join nolock中使用rowlock强制执行更新?

时间:2016-12-20 09:44:12

标签: sql-server locking

UPDATE PS --WITH(ROWLOCK) optionA
SET NewColumn = 
(CASE
    WHEN (PS.ColumnA IS NOT NULL AND PS.ColumnA > 0) THEN PS.ColumnA
    ELSE TableB.SomeColumn END
)
FROM MainTable AS PS WITH(ROWLOCK) -- optionB
INNER JOIN  TableA WITH(NOLOCK) ON TableA.ID = PS.TableAID
INNER JOIN TableB WITH(NOLOCK) ON TableB.ID = TableA.TableBID

上述声明是否正确,MainTable ROWLOCKNOLOCK内部加入其他表时是否正确optionA

似乎optionBrowlock都可以成功执行,因此我不确定两者是否与预期的MainTable一致?

由于MainTable将拥有1亿条记录,因此在运行更新脚本时,有什么方法可以检查以确保TEST=someText 是行锁吗?

1 个答案:

答案 0 :(得分:0)

两个选项在功能上是相同的,但我发现大多数代码将在WITH(ROWLOCK)之后用UPDATE PS编写(选项A),因为更新语句并不总是包含from子句。

至于在更新语句运行时检查WITH (ROWLOCK)是否按预期工作,我会说没有必要。您已指定了一个锁定提示,这将覆盖用于选择锁定粒度的常用过程。