说白了,使用的缺点和优点是什么

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

在.NET应用程序和报告服务应用程序的查询中?


当前回答

这对于查看长插入查询的进度,进行粗略估计(如COUNT(*)或粗略SUM(*))等非常有用。

换句话说,脏读查询返回的结果是好的,只要您将它们视为估值,并且不基于它们做出任何关键决策。

其他回答

这对于查看长插入查询的进度,进行粗略估计(如COUNT(*)或粗略SUM(*))等非常有用。

换句话说,脏读查询返回的结果是好的,只要您将它们视为估值,并且不基于它们做出任何关键决策。

我最喜欢的read uncommitted用例是调试事务中发生的一些事情。

在调试器下启动软件,当您逐步执行代码行时,它会打开一个事务并修改数据库。当代码停止时,您可以打开一个查询分析器,将其设置为读取未提交隔离级别,并进行查询以查看发生了什么。

您还可以使用它来查看长时间运行的过程是否卡住,或者使用带有count(*)的查询正确地更新数据库。

如果您的公司喜欢创建过于复杂的存储过程,那么这是很好的选择。

我现在总是使用READ UNCOMMITTED。速度快,问题少。当使用其他隔离时,你几乎总是会遇到一些阻塞问题。

只要你使用自动递增字段,多注意一下插入,你就可以和阻塞问题说再见了。

你可以用READ uncommitted犯错误,但老实说,确保你的插入是完全证明是很容易的。使用选择结果的插入/更新只是你需要注意的事情。(此处使用READ COMMITTED,或确保脏读不会引起问题)

所以去脏读吧(特别是大报告),你的软件会运行得更流畅……

关于报告,我们在所有报告查询上使用它,以防止查询陷入数据库。我们可以这样做,因为我们提取的是历史数据,而不是精确到微秒的数据。

此隔离级别允许脏读。一个事务可以看到其他事务所做的未提交的更改。

为了保持最高级别的隔离,DBMS通常需要对数据进行锁定,这可能会导致并发性损失和较高的锁定开销。此隔离级别将放松此属性。

你可能想要查看维基百科上关于READ UNCOMMITTED的文章,以获得一些例子和进一步的阅读。


您可能还会对Jeff Atwood的博客文章感兴趣,这篇文章讲述了他和他的团队在Stack Overflow早期是如何解决死锁问题的。杰夫说:

But is nolock dangerous? Could you end up reading invalid data with read uncommitted on? Yes, in theory. You'll find no shortage of database architecture astronauts who start dropping ACID science on you and all but pull the building fire alarm when you tell them you want to try nolock. It's true: the theory is scary. But here's what I think: "In theory there is no difference between theory and practice. In practice there is." I would never recommend using nolock as a general "good for what ails you" snake oil fix for any database deadlocking problems you may have. You should try to diagnose the source of the problem first. But in practice adding nolock to queries that you absolutely know are simple, straightforward read-only affairs never seems to lead to problems... As long as you know what you're doing.

您可能想要考虑的READ UNCOMMITTED级别的一个替代方案是READ COMMITTED SNAPSHOT。再次引用杰夫的话:

快照依赖于一种全新的数据变化跟踪方法…不仅仅是轻微的逻辑更改,它还要求服务器以不同的物理方式处理数据。一旦启用了这个新的数据更改跟踪方法,它就会为每个数据更改创建一个副本或快照。通过在争用时读取这些快照而不是实时数据,读取时不再需要共享锁,并且整体数据库性能可能会提高。