Sql server 如何在内部连接nolock时使用rowlock强制更新?

Sql server 如何在内部连接nolock时使用rowlock强制更新?,sql-server,locking,Sql Server,Locking,上述语句是否正确地确保了MainTable是ROWLOCK,而内部使用NOLOCK连接其他表 似乎optionA和optionB都可以成功执行,因此我不确定这两个选项对于预期的rowlock是否都是正确的 由于MainTable将有1亿条记录,在运行更新脚本时,我是否可以检查MainTable是否为rowlock?这两个选项在功能上是相同的,尽管我发现大多数代码都是在更新PS之后使用和(rowlock)编写的,as update语句并不总是包含from子句 至于在update语句运行时用(ROW

上述语句是否正确地确保了
MainTable
ROWLOCK
,而内部使用
NOLOCK
连接其他表

似乎
optionA
optionB
都可以成功执行,因此我不确定这两个选项对于预期的
rowlock
是否都是正确的


由于
MainTable
将有1亿条记录,在运行更新脚本时,我是否可以检查
MainTable
是否为rowlock?

这两个选项在功能上是相同的,尽管我发现大多数代码都是在
更新PS
之后使用
和(rowlock)
编写的,as update语句并不总是包含from子句


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

这两个选项在功能上是相同的,尽管我发现大多数代码都是在
with(ROWLOCK)
之后使用
with(ROWLOCK)
编写的,因为UPDATE语句并不总是包含from子句


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

通过将
与(ROWLOCK)
放置在
更新PS
之后或在
FROM
部分不会引发任何错误,并且这两个部分都是可执行的。这两种方法都是正确的,并且确实如预期的那样锁定?非常正确,几年来看到它只以一种方式编写已经产生了效果,我编辑了我的答案。通过将
与(ROWLOCK)
放在
更新PS
之后,或者在
FROM
部分不会抛出任何错误,这两种方法都是可执行的。这两种方法都是正确的,真的如预期的那样锁定了吗?完全正确,几年来看到它只以一种方式书写已经产生了效果,我已编辑了我的答案。您是说要检查update语句在执行前是否按预期锁定?您是说要检查update语句在执行前是否按预期锁定?
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