我在MSDN文档中找到了两个关于ReadCommitted
如何工作的IMHO不一致描述:
https://msdn.microsoft.com/en-us/library/ms173763.aspx
指定语句无法读取已修改但未由其他事务提交的数据。
https://technet.microsoft.com/en-us/library/aa259216%28v=sql.80%29.aspx 指定在读取数据时保留共享锁以避免脏读,...
我很困惑:在ReadCommitted
的情况下,SQL Server会在您READ
或WRITE
未提交数据时锁定?请澄清谁知道肯定
答案 0 :(得分:1)
总是写X锁。总是。这样可以保证回滚能够正常工作。回滚需要已知且稳定的数据。
关于读取:RC保证RC读取器不会看到未提交的写入。 RC可以被认为是对正在读取的数据进行短暂的S锁定。但是有一个例外:SQL Server有一个优化,因为它不会对未修改页面上的行进行S锁定。这意味着您可以读取RC下在其他事务中被锁定的行(!)。这符合不读未提交数据的合同。
示例:如果存在修改了数据库任何子集的写入tran,则100%确定RC读者在作者提交之前不会察觉到这些更改。
RC的保证非常薄弱,通常只能用于您基本上不关心数据一致性的情况。