在一个庞大的数据库上,我正在提取大量数据。例如我的查询是
select * from temp
它导致我的应用程序用户出错,然后我意识到我是因为我的查询花了太长时间来提取数据。
然后我用
修改了我的查询select * from temp with(nolock)
然后一切顺利。有人请解释为什么nolock如此重要。
答案 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来进行操作查询和操作报告。这可能会影响运营并且存在风险