【发布时间】:2014-05-05 07:40:50
【问题描述】:
我的老板一直强迫我用with (nolock) 编写SELECT 查询以防止死锁。但是 AFAIK,默认情况下 Select 语句没有锁,因此使用 with (nolock) 选择和不选择没有任何区别。如果我错了,请纠正我。
两个查询:
SELECT * from EMP with (nolock)
SELECT * from EMP
两者不一样。如果我不放 nolock 会不会容易出现死锁?请告诉我应该使用什么。
【问题讨论】:
-
视情况而定。在高插入情况下,使用 with(nolock) 可能会读取不正确的数据(不仅仅是陈旧的数据)。 brentozar.com/archive/2011/11/… 修复实际问题,而不是症状。如果您所做的只是在 SSMS 中运行太宽(选择 *)、太大(没有 WHERE 子句)查询以检查数据(如上面的示例),那么是的,使用 with(nolock)
-
这是另一个关于这个主题的好问题stackoverflow.com/questions/1452996/…
-
说 SELECT 查询不做任何锁定是不正确的,在默认事务隔离级别下,即 READ COMMITTED 选择查询确实获得资源上的共享锁。当使用 NOLOCK 查询提示时,它根本不需要任何锁。正如米奇在没有获得锁时提到的那样,您的查询对脏读(未提交的数据)是开放的。
-
我推荐阅读这篇关于sql server中锁和死锁的文章aboutsqlserver.com/lockingblocking
标签: sql-server sql-server-2008 select deadlock