【发布时间】:2010-09-06 10:58:12
【问题描述】:
为什么我应该或不应该使用脏读:
set transaction isolation level read uncommitted
在 SQL Server 中?
【问题讨论】:
-
@A-K 第一个链接现在是 404
标签: sql sql-server
为什么我应该或不应该使用脏读:
set transaction isolation level read uncommitted
在 SQL Server 中?
【问题讨论】:
标签: sql sql-server
事情是当你想在提交之前读取数据,我们可以借助设置事务隔离级别读取未提交,数据可能会,也可能不会改变。
我们可以通过查询来读取数据:
Select * from table_name with(nolock)
这仅适用于读取未提交的隔离级别。
【讨论】:
来自MSDN:
设置此选项时,可以读取未提交或脏数据;数据中的值可以更改,并且行可以在事务结束之前在数据集中出现或消失。
简单地说,当您使用此隔离级别,并且您在一个事务中对活动表执行多个查询时,不能保证在事务的不同部分返回给您的信息将保持不变.您可以在一个事务中查询相同的数据两次并获得不同的结果(这可能发生在不同的用户在您的事务中更新相同的数据的情况下)。这显然会对依赖数据完整性的应用程序部分产生严重影响。
【讨论】:
如果您想立即恢复数据,请使用它,如果正确则不那么重要
如果数据对正确性很重要,或者您正在使用它进行更新,请不要使用
还可以看看 sql server 2005 中引入的快照隔离
【讨论】:
通常当您需要对繁忙的表执行大量(或频繁)查询时,其中已提交的读取可能会被来自未提交事务的锁阻塞,但仅当您可以处理不准确的数据时。
例如,在我最近工作的一个游戏网站上,有一个关于最近游戏的一些统计数据的摘要显示,这都是基于脏读,对我们来说更重要的是包含然后排除交易数据而不是尚未提交(无论如何,我们知道很少有交易会被撤销),我们认为平均而言,这样数据会更准确。
【讨论】: