Sql server 为什么使用读未提交隔离级别?

Sql server 为什么使用读未提交隔离级别?,sql-server,tsql,isolation-level,Sql Server,Tsql,Isolation Level,简单地说,使用英语的缺点和优点是什么 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 在查询.NET应用程序和reporting services应用程序时?的优点是,在某些情况下,查询速度更快。缺点是结果可能是错误的(尚未提交的数据可能会被返回),并且不能保证结果是可重复的 如果你在乎准确性,就不要用这个 详情如下: 实现脏读或隔离级别0锁定,这意味着不会发出共享锁,也不会使用独占锁。设置此选项后,可以读取未提交或脏数据;在事务结束之前,数据

简单地说,使用英语的缺点和优点是什么

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

在查询.NET应用程序和reporting services应用程序时?

的优点是,在某些情况下,查询速度更快。缺点是结果可能是错误的(尚未提交的数据可能会被返回),并且不能保证结果是可重复的

如果你在乎准确性,就不要用这个

详情如下:

实现脏读或隔离级别0锁定,这意味着不会发出共享锁,也不会使用独占锁。设置此选项后,可以读取未提交或脏数据;在事务结束之前,数据中的值可以更改,行可以在数据集中出现或消失。此选项的效果与在事务中所有SELECT语句的所有表上设置NOLOCK相同。这是四个隔离级别中限制最少的


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

为了保持最高级别的隔离,DBMS通常会获取数据锁,这可能会导致并发性丢失和高锁定开销。此隔离级别放松此属性

您可能想查看一些示例并进一步阅读


您可能还想看看Jeff Atwood关于他和他的团队在堆栈溢出早期如何解决死锁问题的文章。据杰夫说:

但是
nolock
危险吗?
你能结束吗 在
readuncommitted
打开时向上读取无效数据?是的,理论上。你会 不乏数据库 建筑宇航员谁开始 向你和所有人灌输酸性科学 但是,当发生火灾时,请拔下建筑物的火警报警器 你告诉他们你想试试
nolock
。 这是真的:这个理论很可怕。但是 我是这么想的:“理论上是这样的 理论和实践没有区别 实践。在实践中有。”

我从不建议使用
nolock
作为一个普通的“对你的病有好处” 蛇油修复任何数据库 您可能有死锁问题。你 应尝试诊断故障的来源 首先是问题

但在实践中,将
nolock
添加到您绝对知道是简单、直接的只读事务的查询中似乎永远不会导致问题只要你知道自己在做什么。

< P> >代码>读取未提交的级别,您可能需要考虑的是<代码> Read提交的快照< /代码>。再次引用杰夫的话:

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


这有助于查看长插入查询的进度,进行任何粗略估计(如
COUNT(*)
或粗略
SUM(*)
)等


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

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

只要您使用自动递增字段,并稍微注意插入,那么您的罚款,您就可以告别阻塞问题

您可以在READ Uncommitted中出错,但老实说,很容易确保插入内容是完全可靠的。使用选择结果的插入/更新是您需要注意的唯一事项。(在此处使用READ COMMITTED,或确保脏读不会导致问题)


因此,进行脏读(特别是大型报告),您的软件将运行得更平稳…

这将为您提供脏读,并显示尚未提交的事务。这是最明显的答案。我不认为这是一个好主意,使用这个只是为了加快你的阅读。如果使用良好的数据库设计,还有其他方法可以做到这一点

注意什么没有发生也很有趣。READ UNCOMMITTED不仅忽略其他表锁。它本身也不会导致任何锁

假设您正在生成一个大型报告,或者正在使用一个大型且可能复杂的SELECT语句从数据库中迁移数据。这将导致共享锁在事务期间升级为共享表锁。其他事务可以从表中读取,但无法进行更新。如果是生产数据库,这可能是个坏主意,因为生产可能会完全停止

如果使用READ UNCOMMITTED,则不会在表上设置共享锁。您可以从一些新事务中获得结果,也可以不依赖于插入数据的表的位置以及SELECT事务的读取时间。例如,如果发生页面拆分,您也可能会两次获得相同的数据(数据将复制到数据文件中的另一个位置)

因此,如果在执行SELECT时可以插入数据对您非常重要,那么READ UNCOMMITED可能是有意义的。你必须考虑你的报告可能包含一些错误,但是如果它基于数以百万计的行,并且只有少数几个在选择结果时被更新,这可能是“足够好”了。您的事务也可能一起失败,因为可能无法保证行的唯一性

一个更好的方法可能是使用快照隔离级别,但您的应用程序可能需要进行一些调整才能使用