我知道 NOLOCK 是 SELECT 操作的默认值。因此,如果我什至不with (NOLOCK)
为选择查询编写关键字,该行将不会被锁定。
with (ROWLOCK)
如果没有为 UPDATE 和 DELETE 查询指定,我找不到会发生什么。以下查询之间有区别吗?
UPDATE MYTABLE set COLUMNA = 'valueA';
和
UPDATE MYTABLE WITH (ROWLOCK) set COLUMNA = 'valueA';
我知道 NOLOCK 是 SELECT 操作的默认值。因此,如果我什至不with (NOLOCK)
为选择查询编写关键字,该行将不会被锁定。
with (ROWLOCK)
如果没有为 UPDATE 和 DELETE 查询指定,我找不到会发生什么。以下查询之间有区别吗?
UPDATE MYTABLE set COLUMNA = 'valueA';
和
UPDATE MYTABLE WITH (ROWLOCK) set COLUMNA = 'valueA';
在语句 1(没有行锁)中,DBMS 决定锁定整个表或更新记录所在的页面。所以这意味着在更新行时,表中的所有或其他行数都被锁定,无法更新或删除。
语句 2 (with (ROWLOCK)) 建议 DBMS 只锁定正在更新的记录。但请注意,这只是一个提示,并不能保证它会被 DBMS 接受。
如果没有提示,则 db 引擎根据操作(选择/修改)、隔离和粒度级别以及升级粒度级别的可能性来选择 LOCK mdoe。指定 ROWLOCKX 不会给出 100% 的结果,即它将是 X 行。一般来说,对于如此广泛的问题,一个非常大的话题
首先阅读有关https://technet.microsoft.com/en-us/library/ms175519(v=sql.105).aspx的锁定模式 如果
因此,如果我什至不为选择查询编写 (NOLOCK) 关键字,则该行将不会被锁定。
选择查询总是需要一个锁,它被称为共享锁,锁的持续时间取决于你的隔离级别
以下查询之间有区别吗?
更新 MYTABLE 设置 COLUMNA = 'valueA';
和
UPDATE MYTABLE WITH (ROWLOCK) set COLUMNA = 'valueA';
假设您的第一条语句影响超过 5000 个锁,锁将升级到表,但使用行锁...SQLServer 不会锁定总表