SQL Server ReadCommitted隔离级别如何真正起作用?

时间:2015-05-19 21:53:51

标签: sql-server

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

  1. https://msdn.microsoft.com/en-us/library/ms173763.aspx

    指定语句无法读取已修改但未由其他事务提交的数据。

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

  3. 我很困惑:在ReadCommitted的情况下,SQL Server会在您READWRITE未提交数据时锁定?请澄清谁知道肯定

1 个答案:

答案 0 :(得分:1)

总是写X锁。总是。这样可以保证回滚能够正常工作。回滚需要已知且稳定的数据。

关于读取:RC保证RC读取器不会看到未提交的写入。 RC可以被认为是对正在读取的数据进行短暂的S锁定。但是有一个例外:SQL Server有一个优化,因为它不会对未修改页面上的行进行S锁定。这意味着您可以读取RC下在其他事务中被锁定的行(!)。这符合不读未提交数据的合同。

示例:如果存在修改了数据库任何子集的写入tran,则100%确定RC读者在作者提交之前不会察觉到这些更改。

RC的保证非常薄弱,通常只能用于您基本上不关心数据一致性的情况。