谁能解释所涉问题的使用 with (nolock) 在查询的时候,你应该/不应该使用它?

例如,如果你有一个银行业务应用程序的高额交易费率和很多的数据在某些桌子,在哪些类型的查询将nolock事吧?是有情况下,当你应该始终使用/未使用它?

有帮助吗?

解决方案

使用(NOLOCK)是使用READ UNCOMMITED作为事务隔离级别的等价物。所以,你站的读取未提交的行,随后回滚的风险,即是从未进入数据库的数据。所以,虽然它可以防止读取被其他操作僵持不下,它带有一个风险。在高交易率的银行应用程序,它可能不会是什么问题,你想用恕我直言它解决了合适的解决方案。

其他提示

问题是什么更糟糕的是:

  • 一个陷入僵局,或
  • 一个错误的价值?

对于财务数据库、死锁是远比是错误的价值观。我知道这听起来倒退,但听我说。传统的例子数据库的交易是你的更新两个排,减去从一个增加到另一个。这是错误的。

在一个金融数据库使用的商业交易。这意味着增加一个行为每个帐户。最重要的是,这些交易完成和行成功编写的。

得到的账户余额暂时错误的不是一个大问题,这就是一天的结束和解。和一个透支从一个账户是更有可能发生,因为两个自动取款机正在使用一次因为一个未提交的读数据库。

这就是说,SQL服务器2005年的固定最大的错误了 NOLOCK 必要的。所以,除非你使用的SQL Server2000年或更早的,你不需要它。

进一步阅读
行级别的版本

有NOLOCK提示的合法使用的教科书的例子是针对高更新OLTP数据库报告采样。

要采取的局部例子。如果一家大型美国高街银行想跑每小时报告找上银行一个城市级别的运行的第一个标志,一个NOLOCK查询可以扫描事务表每个城市合计现金存款和取款。对于这样的报道轧造成错误的很小一部分回更新的交易将不会降低报告的价值。

不幸的是,不只是读未提交的数据。在此背景下,你可能最终阅读页面两次(在页面拆分的情况下),或者你可以完全错过的网页。所以,你的结果可能会严重扭曲。

请查看伊茨克奔甘的文章。下面是一个摘录:

  

”随着NOLOCK提示(或设置   会话的隔离级别为READ   未提交)告诉你的SQL Server   你不要指望一致性,所以有   没有保证。请注意,尽管   该“数据不一致”并不只   意味着你可能会看到未提交   变化是后来被回滚,   在中间或数据的变化   交易的状态。的它还   意味着在一个简单的查询   扫描所有表/索引数据的SQL Server   可能会失去的扫描位置,或者你   最终可能会得到同样的行   两次即可。 “

不知道为什么你不在数据库事务包装的金融交易(当你从一个帐户转帐到另一个 - 你不-A-时间提交事务的一面 - 这就是为什么明确的交易存在) 。即使你的代码是新空房禁地,以商业交易,因为它听起来就像是,所有的事务型数据库需要做的隐含回滚在错误或故障的情况下的潜力。我认为这种讨论方式在你的头上。

如果您有锁定问题,实现版本控制和清理你的代码。

没有锁不仅会返回错误的值返回幻像记录和复制。

这是一个常见的误解它总是让查询的运行速度更快。如果有在表上没有写锁,它没有任何区别。如果在表上的锁,它可以使查询速度更快,但有锁首先被发明的理由。

在公平性,这里有两个特殊情形,其中一个NOLOCK提示可以提供效用

1)需要运行防住OLTP数据库长的查询,这可能是唯一的出路2005年之前的SQL Server数据库

2)写得不好应用用于锁定记录,并把控制返回到UI和读卡器被无限期地阻止。 NOLOCK可以在这里有益的,如果应用程序不能是固定的(第三方等)和数据库要么预先2005或版本不能导通。

NOLOCK相当于READ UNCOMMITTED,但是微软说你不应该使用它UPDATEDELETE语句:

  

有关UPDATE或DELETE语句:此功能将在Microsoft SQL Server的未来版本中删除。避免在新的开发工作中使用该功能,并计划修改当前使用此功能的应用程序。

http://msdn.microsoft.com/en-us/library/ ms187373.aspx

本文适用于SQL Server 2005,因此,如果您正在使用的版本存在NOLOCK支持。为了面向未来,你的代码(假设你已经决定使用脏读),你可以在你的存储过程中使用这样的:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

您可以使用它,当你只是读取数据,而你真的不关心你是否可以回去了一个尚未提交的数据。

它可以在读操作更快,但我真的不能被说多少。

在一般情况下,我建议不要使用它 - 读未提交的数据可以是一个有点混乱充其量

在那里它通常是没关系另一种情况是在报告数据库中,数据可能是已经老化和写入只是不会发生。在这种情况下,虽然,选项应在数据库或表级别由管理员通过更改默认隔离级别设置。

在一般情况下:你可以使用它时,你的非常的确认也没关系读取旧数据。要记住的重要一点是,它的很容易得到那错的。例如,即使是好你编写查询的时候,你确定的东西在数据库中,将来也不会改变,使这些更新更重要?

我要还2日的概念,它可能的的银行应用程序是个好主意。或库存应用程序。或任何你正在考虑的交易。

答案很简单 - 只要你的SQL不改变数据,你有可能与其它活动干扰(通过锁定)查询

这是值得考虑用于报告任何疑问,特别是如果查询采用不止,比方说,1秒。

如果你有你对OLTP数据库运行OLAP类型的报表,这就特别有用。

第一个要问的问题,虽然是“为什么我担心这个?” LN我的经验,往往捏造默认的锁定行为发生时有人在“尝试任何事情”的模式,这是一个情况下意外的后果并非不可能。往往是过早的优化的情况下,可以很容易被甩嵌入到应用“以防万一”。了解为什么你这样做,它解决了什么问题,这一点很重要,以及你是否确实有问题。

我的2美分 - 这是有道理的使用WITH (NOLOCK)当你需要生成报表。在这一点上,数据也不会发生大的变化和你不想要锁定的记录。

如果您正在处理金融事务,那么你将永远不会想使用nolocknolock最适合用来从有大量的更新大表选择,你不在乎,如果你得到的记录也可能会被过时了。

有关财务记录(在大多数应用中几乎所有其他记录)nolock将肆虐,你可能读取数据从已被写入记录后面,并没有得到正确的数据。

我用来获取“下一批”的事情要做。它不会在这种情况下它的确切项目无所谓了,我有很多运行该查询的用户。

<强>短的答案:

不要使用WITH (NOLOCK)

<强>长答案:

NOLOCK经常利用为神奇方式来加快数据库中读取,但我会尽量避免使用它尽可能。

的结果集可以包含尚未提交的行,即通常稍后回滚。

这是错误或结果集可以为空,是缺少的行或多次显示在同一行。

这是因为其他事务在你读它,同时移动数据。

READ COMMITTED添加其中的数据被多个用户同时改变相同的小区的单个列中损坏一个额外的问题。

有其他副作用太,导致牺牲速度增加你希望首先获得。

可以说,这是罚款地方,你可以逃脱它使用它,但有什么意义呢?我不能想到的任何情况下损坏的数据是可接受的。

永远不要使用NOLOCK如初。

(曾经)

使用时,你都还好用“脏”数据NOLOCK。这意味着NOLOCK也可以读取数据,其处于被修改和/或未提交的数据的过程。

这是一般不高的交易环境中使用它是一个好主意,这就是为什么它不是查询默认选项。

我与(NOLOCK)暗示特别是在SQLServer的使用2000米的数据库具有高活性。我不能肯定它是需要在SQL Server 2005但是。我最近加入一个SQL Server 2000是暗示在客户端的DBA的要求,因为他注意到很多SPID记录锁定。

我可以说的是,使用暗示并没有伤害我们,似乎已经作出的锁定问题自行解决。在该特定客户端的DBA基本上坚持我们使用提示。

顺便说一句,我处理数据库是后端企业医疗报销系统,所以我们正在谈论数百万的记录,并在很多连接20+表。我通常添加WITH(NOLOCK)提示每个表的加入(除非它是一个派生表,在这种情况下不能使用该特定的提示)

最简单的答案是一个简单的问题 - 你需要你的结果是可重复的?如果是的话则NOLOCKS是不恰当的,任何情况下

如果您不需要重复性然后nolocks可能是有用的,特别是如果你没有在连接到目标数据库中的所有过程的控制。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top