Sql Server中INSERT,UPDATE或DELETE操作的哪种锁定模式?

时间:2017-11-08 06:56:00

标签: sql-server database sql-server-2014 rowlocking

我知道NOLOCK是SELECT操作的默认设置。因此,如果我甚至不为选择查询编写with (NOLOCK)关键字,则该行不会被锁定。

如果没有为UPDATE和DELETE查询指定with (ROWLOCK),我找不到会发生什么。以下查询之间有区别吗?

UPDATE MYTABLE set COLUMNA = 'valueA';

UPDATE MYTABLE WITH (ROWLOCK) set COLUMNA = 'valueA';

3 个答案:

答案 0 :(得分:0)

如果没有提示,则db引擎选择LOCK mdoe作为操作(选择/修改)的函数,隔离级别和粒度,以及升级粒度级别的可能性。指定ROWLOCKX不会给出100%的结果,即它在行上是X.一般来说,这个广泛问题的主题非常大

首先阅读https://technet.microsoft.com/en-us/library/ms175519(v=sql.105).aspx的锁定模式 如果

答案 1 :(得分:0)

  

因此,如果我甚至不使用(NOLOCK)关键字为选择查询编写,则该行不会被锁定。

选择查询始终采用锁定,它被称为共享锁定,锁定的持续时间取决于您的隔离级别

  

以下查询之间是否存在差异?

     

UPDATE MYTABLE设置COLUMNA =' valueA';
  和
  用(ROWLOCK)更新MYTABLE设置COLUMNA =' valueA';

假设您的第一个语句影响超过5000个锁,锁将升级到表,但是使用rowlock ... SQLServer不会锁定总表

答案 2 :(得分:0)

在语句1(没有行锁)中,DBMS决定锁定整个表或更新记录所在的页面。所以这意味着在更新行时,表中的所有或多个其他行都被锁定,无法更新或删除。

语句2(带(ROWLOCK))建议DBMS仅锁定正在更新的记录。但是要知道这只是一个提示,并且不能保证它会被DBMS接受。