0

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

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

UPDATE MYTABLE set COLUMNA = 'valueA';

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

3 回答 3

0

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

语句 2 (with (ROWLOCK)) 建议 DBMS 只锁定正在更新的记录。但请注意,这只是一个提示,并不能保证它会被 DBMS 接受。

于 2017-11-08T07:19:05.023 回答
0

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

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

于 2017-11-08T07:11:48.050 回答
0

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

选择查询总是需要一个锁,它被称为共享锁,锁的持续时间取决于你的隔离级别

以下查询之间有区别吗?

更新 MYTABLE 设置 COLUMNA = 'valueA';

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

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

于 2017-11-08T07:12:23.670 回答