Kip*_*eal 215 t-sql sql-server isolation-level
用简单的英语,使用的缺点和优点是什么
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Run Code Online (Sandbox Code Playgroud)
在查询.NET应用程序和报告服务应用程序?
Dan*_*llo 196
此隔离级别允许脏读.一个事务可能会看到某些其他事务所做的未提交的更改.
为了保持最高级别的隔离,DBMS通常会获取数据锁定,这可能会导致并发丢失和高锁定开销.这种隔离水平放松了这个属性.
您可以查看维基百科的文章,READ UNCOMMITTED
了解一些示例并进一步阅读.
您可能还有兴趣查看Jeff Atwood的博客文章,了解他和他的团队如何解决Stack Overflow早期的死锁问题.据杰夫说:
但是
nolock
危险吗?你最终可以用read uncommitted
on 读取无效数据吗?是的,从理论上讲.你会发现不缺少数据库架构的宇航员,他们开始放弃你的ACID科学,除了你告诉他们你想尝试的时候,他们会拉出建筑物火警nolock
.这是真的:理论是可怕的.但这就是我的想法:"从理论上讲,理论与实践之间没有区别.在实践中也存在差异."我永远不会建议你使用
nolock
蛇油来解决任何数据库死锁问题.您应该首先尝试诊断问题的根源.但实际上,添加
nolock
到你绝对知道的查询是简单的,直截了当的只读事务似乎永远不会导致问题... 只要你知道你在做什么.
READ UNCOMMITTED
您可能想要考虑的级别的一个替代方案是READ COMMITTED SNAPSHOT
.再次引用杰夫:
快照依赖于全新的数据更改跟踪方法......不仅仅是轻微的逻辑更改,它还要求服务器以不同的方式处理数据.启用此新数据更改跟踪方法后,它会创建每个数据更改的副本或快照.通过在争用时读取这些快照而不是实时数据,读取时不再需要共享锁,并且整体数据库性能可能会提高.
Qua*_*noi 35
这可能是有用的,看久插入查询的进步,使任何粗略估计(如COUNT(*)
或粗糙SUM(*)
)等.
换句话说,只要您将脏读取查询视为估计并且不基于它们做出任何关键决策,那么脏读取查询返回的结果就可以了.
nev*_*ves 33
我最喜欢的用例read uncommited
是调试事务中发生的事情.
在调试器下启动软件,当您逐步执行代码行时,它会打开一个事务并修改您的数据库.代码停止时,您可以打开查询分析器,设置读取未提交的隔离级别并进行查询以查看发生的情况.
您还可以使用它来查看长时间运行的过程是否卡住或正确更新数据库.
如果您的公司喜欢制作过于复杂的存储过程,那就太棒了.
Ada*_*ish 12
什么时候可以使用READ UNCOMMITTED
?
好:大汇总报告显示不断变化的总数.
风险:几乎所有其他事情.
好消息是大多数只读报告都属于Good类别.
好的使用它:
这可能涵盖了商业智能部门在SSRS中所做的大部分工作.当然,除了前面有$符号的任何东西都是例外.许多人的钱比热情高于应用于为客户提供服务并产生这些钱所需的相关核心指标.(我责怪会计师).
有风险的时候
任何详细程度的报告.如果需要该细节,通常意味着每一行都与决策相关.实际上,如果你不能在没有阻塞的情况下拉出一个小的子集,那么可能是因为它正在被编辑.
历史数据.它很少有实际的区别,但是用户理解不断变化的数据并不完美,他们对静态数据的感受并不相同.脏读不会在这里受到伤害,但偶尔会有双读.看来你不应该对静态数据有阻塞,为什么要冒风险呢?
几乎任何能够提供具有写入功能的应用程序的东西.
甚至OK方案都不行.
NOLOCK
在这些表上使用任何东西.在源极不可能更改的情况下使用 READ_UNCOMMITTED。
当您知道源在获取操作期间可能会发生变化时,请勿使用 READ_UNCOMMITTED。