NOLOCK和UNCOMMITTED有什么区别?

Ard*_*oli 38 sql sql-server locking isolation-level sql-server-2012

我使用SQL Server 2012.

我写了两个查询但是NOLOCK和之间有什么不同UnCommitted

SELECT lastname, firstname
FROM HR.Employees with (READUNCOMMITTED)

SELECT lastname, firstname 
FROM HR.Employees with (NoLock)
Run Code Online (Sandbox Code Playgroud)

Pரத*_*ீப் 41

NOLOCK:相当于READUNCOMMITTED(来源:MSDN)

NOLOCKREADUNCOMMITTED指定允许脏读.不会发出共享锁以防止其他事务修改当前事务读取的数据,并且其他事务设置的排它锁不会阻止当前事务读取锁定的数据.允许脏读可以导致更高的并发性,但代价是读取数据修改,然后由其他事务回滚

READUNCOMMITTEDNOLOCK提示仅适用于数据锁.所有查询(包括那些查询with READUNCOMMITTED and NOLOCK hints)在编译和执行期间都会获取Sch-S(模式稳定性)锁.因此,当并发​​事务在表上持有Sch-M(模式修改)锁时,将阻止查询


Pra*_*abu 17

在引擎盖下,他们正在执行相同的操作.

read-uncommitted隔离级别是SQL Server,它也希望减少阻塞时,是什么使得它受欢迎的开发商中最低限制的隔离级别.

nolock幕后的表提示执行与在未读提交的隔离级别下运行完全相同的操作.

唯一的区别两者之间是read-uncommitted隔离级别决定了整个连接的锁紧机构和nolock表提示确定你给的提示表的锁定机制.


Cod*_*ent 15

与其他人提到的一样,它们的功能没有区别.

唯一的区别是您可以WITH(NOLOCK)选择性地应用于某些表而不是其他表.READ UNCOMMITTED适用NOLOCK于会话中的所有表.

如果你这样做:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT *
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.id
Run Code Online (Sandbox Code Playgroud)

它在功能上等同于:

SELECT *
FROM Table1 T1 WITH(NOLOCK)
INNER JOIN Table2 T2 WITH(NOLOCK) ON T1.ID = T2.ID
Run Code Online (Sandbox Code Playgroud)

但您也可以WITH(NOLOCK)选择性地申请:

SELECT *
FROM Table1 T1 WITH(TABLOCK)
INNER JOIN Table2 WITH(NOLOCK) ON T1.ID = T2.ID
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,OP 正在询问同义表提示 NOLOCK 和 READUNCOMMITED。 (3认同)

小智 7

声明级别没有区别.

您可以在会话级别设置READUNCOMMITED,在这里您必须编写SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED