我知道NOLOCK是SELECT操作的默认设置。因此,如果我甚至不为选择查询编写with (NOLOCK)
关键字,则该行不会被锁定。
如果没有为UPDATE和DELETE查询指定with (ROWLOCK)
,我找不到会发生什么。以下查询之间有区别吗?
UPDATE MYTABLE set COLUMNA = 'valueA';
和
UPDATE MYTABLE WITH (ROWLOCK) set COLUMNA = 'valueA';
答案 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接受。