SQL Server ReadCommitted隔离级别是如何工作的?



我在MSDN文档中发现了两个IMHO不一致的关于ReadCommitted如何工作的描述:

    https://msdn.microsoft.com/en-us/library/ms173763.aspx
  1. 指定语句不能读取已被修改但未被其他事务提交的数据。

  2. https://technet.microsoft.com/en-us/library/aa259216%28v=sql.80%29.aspx指定在读取数据时保持共享锁以避免脏读取,…

我很困惑:在ReadCommitted的情况下,SQL Server把锁,而你READ或而你WRITE未提交的数据?

总是写x锁。总是这样。这是为了保证回滚工作。回滚需要已知且稳定的数据。

About reads: RC保证没有未提交的写操作对RC读机可见。RC可以被认为是对正在读取的数据采取短暂的s锁。但有一个例外:SQL Server有一个优化,它不会对未修改页面上的行使用s锁。这意味着您可以读取在其他事务(!)中被x锁定的RC下的行。这很好地满足了不读取未提交数据的约定。

示例:如果有一个写tran修改了数据库的任何子集,那么在写入器提交之前,RC读取器100%肯定不会感知到这些更改。

RC的保证是如此的弱,以至于它通常只能在你根本不关心数据一致性的情况下使用。

最新更新