Sql 为什么;将事务隔离级别设置为“读取未提交”;按不同的顺序返回行?

Sql 为什么;将事务隔离级别设置为“读取未提交”;按不同的顺序返回行?,sql,sql-server-2005,tsql,isolation-level,Sql,Sql Server 2005,Tsql,Isolation Level,当我使用 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 在我的存储过程中 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT CaseRateDetailId,AmtPerWeek FROM CaseRateDetails WHERE CaseRateInfoId = @CaseRateInfoId 下面是存储过程中定义的查询 SET TRANSACTION IS

当我使用

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
在我的存储过程中

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT   CaseRateDetailId,AmtPerWeek
FROM    CaseRateDetails
WHERE   CaseRateInfoId = @CaseRateInfoId
下面是存储过程中定义的查询

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
语句它以正确的顺序返回行,即
500010000150020000250000,…。


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

NOLOCK
TABLOCK
下,您可以获得一个按文件顺序读取页面而不是按照索引的叶级读取页面的命令


无论是否使用此方法,它都不会显示在执行计划中。没有ORDER BY就不能保证任何订单。

没有ORDER BY子句就没有正确的订单。没有ORDER BY-->就没有定义的、保证的或隐含的订单-如果你需要订单,你需要一个ORDER BY-总是+1,因为“但我想知道它这样做的原因。”这很吸引人-你是对的,它没有出现在展示计划中。删除了我的答案,因为你已经证明它是错误的。当本计划显示了索引扫描“<代码>排序:false < /COD> >关系引擎指示它不关心行返回的顺序,这意味着存储引擎将认为这是索引> 64页和数据无法更改的优选选项。(tablock)或隔离级别使其更喜欢速度而不是一致性的任何保证。与索引顺序扫描相比,分配顺序扫描在并发数据修改的情况下更可能丢失行或读取行两次。