SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 的好处

dmo*_*ney 12 sql-server isolation-level

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在大多数一般 SQL 查询中使用,主要是因为这是我最初学习语言时深入了解的。

根据我的理解,这种隔离级别的行为方式与WITH (NO LOCK)我只倾向于使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.

  • 有没有什么时候我应该使用WITH (NO LOCK)over SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
  • 是否 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED阻止其他用户被锁定在我正在阅读的表格之外?
  • 如果 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED用于停止锁,而我只是在读取数据,那么使用它有什么意义?是否只有系统密集型查询会生成锁?在运行会在 5-10 秒内返回的查询时是否值得使用它?
  • 我被告知SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在读取将用于更新的数据时不要使用 ,大概是为了避免更新脏数据。这会是唯一的原因吗?
  • 对于我正在处理的数据库类型,有一个生产和测试环境。我们很少会查询生产环境,但是当我需要时,我通常会SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在我的查询中使用。我知道这可能会导致脏读。除了接收回可能不会提交到数据库的数据(因此将我的结果扔掉)之外,还有哪些其他类型的“脏读”是可能的?

对不起,群众问题。

Ion*_*nic 27

太可怕了,你是这样学的(对不起!)。

READ UNCOMMITTED让你读每一行,是的。甚至那些目前在INSERT, UPDATE,DELETE操作中使用的人。如果您需要快速查看一些数据或在任务关键 -SELECT语句中块会非常有害,这将非常有用。

事实上,你冒着诚信的风险。您可能会读取当前用于删除或更改的行。您也可能读取错误的值。这可能真的不常见,但它可能发生。我是什么意思?好吧,想想一个非常宽的行(它有很多列和很多长nvarchar列)。此行发生更新并设置新值。在极少数情况下,您可能会遇到只阅读半行的情况。例如,如果用户更改了他的登录值,则可能会发生另一件事。他更改了他的邮件 + 密码。邮件已设置,但密码尚未设置。这样你就有了一个不一致的状态。

我建议忘记READ UNCOMMITTED。只需在真正需要的地方使用它。

另一种选择是启用READ_COMMITTED_SNAPSHOT数据库选项 -READ COMMITTED SNAPSHOT由于在 tempdb 中启用了行版本控制,因此您可以使用。这样,您只需读取一行的另一个(旧)版本。这不会阻止您的查询。但是可能会发生您也读取了旧值,但是是一致的旧值。

另一个想法可以WITH(READPAST)代替WITH(NOLOCK). 您将读取表的旧状态(有点像 中的SNAPSHOT ISOLATION),但您将跳过所有当前锁定的行。