【问题标题】:Why "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" returns rows in different order?为什么“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”以不同的顺序返回行?
【发布时间】:2012-02-25 00:23:42
【问题描述】:

当我使用时,我得到的行顺序不同

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

在我的存储过程中。

下面是存储过程中定义的查询。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT   CaseRateDetailId,AmtPerWeek
FROM    CaseRateDetails
WHERE   CaseRateInfoId = @CaseRateInfoId

它像这样返回 AmtPerWeek:

10000,15000,5000,20000,25000,..

当我不使用

运行相同的查询时
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

声明它以正确的顺序返回行,即5000,10000,15000,20000,25000,....

我可以在上面的查询中使用 AmtPerWeek 子句的 order,但我想知道它为什么会这样?为什么会改变行的顺序?

【问题讨论】:

  • 没有order by子句就没有正确订单。
  • No ORDER BY --> 没有定义或保证或隐含的订单 - 如果您需要订单,您需要有一个 ORDER BY - 总是。
  • +1 表示“但我想知道它为什么会这样。”

标签: sql sql-server-2005 tsql isolation-level


【解决方案1】:

NOLOCKTABLOCK 下,您可以获得allocation ordered scan,它按文件顺序读取页面,而不是遵循索引的叶级。

无论是否使用此方法,它都不会出现在执行计划中。如果没有ORDER BY,则无法保证订单。

【讨论】:

  • 这很有趣——你说得对,它没有出现在展示计划中。删除了我的答案,因为你证明它是错误的。
  • @Ben - 当计划显示带有Ordered:False 的索引扫描时,关系引擎表示它不关心行的返回顺序,这意味着存储引擎会将其视为对于索引 > 64 页且数据无法更改(tablock)或隔离级别的首选选项,它更喜欢速度而不是任何一致性保证。在并发数据修改的情况下,分配有序扫描比索引有序扫描更容易丢失行或读取行两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多