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

3
我发现MSDN文档中有两个关于ReadCommitted如何工作的描述,我认为这些描述是不一致的:
1.https://msdn.microsoft.com/en-us/library/ms173763.aspx规定语句无法读取其他事务已经修改但未提交的数据。
2.https://technet.microsoft.com/en-us/library/aa259216%28v=sql.80%29.aspx规定在读取数据时会持有共享锁以避免脏读。
我很困惑:在使用ReadCommitted时,SQL Server是在读取还是写入未提交的数据时放置锁?请澄清谁知道确切情况。
1个回答

1

始终以X锁进行写入。始终如此。这是为了确保回滚可以正常工作。回滚需要已知和稳定的数据。

关于读取:RC保证未提交的写入不会对RC读者可见。可以将RC视为在读取的数据上短暂持有S锁。但是,有一个例外:SQL Server具有一种优化方式,即不对未修改页面上的行获取S锁。这意味着您可以在其他事务中以X锁定的情况下在RC下读取行(!)。这完全满足不读取未提交数据的约定。

例如:如果有一个写入事务已修改数据库的任何子集,则可以100%确定RC读者在编写者提交之前不会感知到这些更改。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接