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
ROWLOCK
与NOLOCK
内部加入其他表时是否正确optionA
?
似乎optionB
和rowlock
都可以成功执行,因此我不确定两者是否与预期的MainTable
一致?
由于MainTable
将拥有1亿条记录,因此在运行更新脚本时,有什么方法可以检查以确保TEST=someText
是行锁吗?
答案 0 :(得分:0)
两个选项在功能上是相同的,但我发现大多数代码将在WITH(ROWLOCK)
之后用UPDATE PS
编写(选项A),因为更新语句并不总是包含from子句。
至于在更新语句运行时检查WITH (ROWLOCK)
是否按预期工作,我会说没有必要。您已指定了一个锁定提示,这将覆盖用于选择锁定粒度的常用过程。