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)
NOLOCK或READUNCOMMITTED指定允许脏读.不会发出共享锁以防止其他事务修改当前事务读取的数据,并且其他事务设置的排它锁不会阻止当前事务读取锁定的数据.允许脏读可以导致更高的并发性,但代价是读取数据修改,然后由其他事务回滚
READUNCOMMITTED和NOLOCK提示仅适用于数据锁.所有查询(包括那些查询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)