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