为什么nolock在查询数据库时很重要

时间:2015-10-07 05:30:08

标签: sql sql-server-2008

在一个庞大的数据库上,我正在提取大量数据。例如我的查询是

select * from temp

它导致我的应用程序用户出错,然后我意识到我是因为我的查询花了太长时间来提取数据。

然后我用

修改了我的查询
select * from temp with(nolock)

然后一切顺利。有人请解释为什么nolock如此重要。

4 个答案:

答案 0 :(得分:5)

NOLOCK 覆盖规则,确保您从数据库中读取的数据一致且符合ACID规则( A tomicity, C onsistency, I solation, D urability )。

如果你运行查询没有 NOLOCK那么你将总是得到相同的结果(假设其他人没有删除或更新任何数据)。

如果您运行查询 WITH NOLOCK两次或更多次,则结果可能会有所不同。

NOLOCK实际上意味着您告诉DB返回它可以读取的数据,无论它是否已经提交到数据库。

因此,总而言之,如果您想要准确数据,NOLOCK非常重要。如果你想要只是数据,那么你可以使用NOLOCK,但它通常不是一个好主意。

答案 1 :(得分:1)

当你说WITH NOLOCK并执行你的查询时,它就像使用READ UNCOMMITED数据。因此,您已准备好读取可以回滚的未提交数据。所以你有阅读脏数据的风险。

您可以参考:

答案 2 :(得分:1)

WITH(nolock)提示是针对特定表或视图的显式命令,用于针对查询的视图中的一个或多个表设置事务隔离级别。一旦发出,锁将不会用于表中的数据。这样做的好处是,对于针对该表运行的任何其他查询,不会发生死锁。另一个间接优势是将使用更少的内存来保存对该数据的锁定

答案 3 :(得分:0)

您可以将NOLOCK用于MIS报告中使用的查询,其中一些数据更改不会影响管理决策。

但是你不应该使用NOLOCK来进行操作查询和操作报告。这可能会影响运营并且存在风险