SQL Server ReadCommitted 隔离级别如何真正起作用?
Posted
技术标签:
【中文标题】SQL Server ReadCommitted 隔离级别如何真正起作用?【英文标题】:How does SQL Server ReadCommitted Isolation Level really work? 【发布时间】:2015-05-19 21:53:51 【问题描述】:我在 MSDN 文档中发现了两个关于 ReadCommitted
如何工作的恕我直言不一致的描述:
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
未提交数据时放置锁?请澄清谁肯定知道
【问题讨论】:
【参考方案1】:始终写入 X 锁。总是。这样可以保证回滚有效。回滚需要已知且稳定的数据。
关于读取:RC 保证没有未提交的写入对 RC 读取器可见。 RC 可以被认为是对正在读取的数据进行短期 S 锁。但是有一个例外:SQL Server 有一个优化,它不会对未修改页面上的行使用 S 锁。这意味着您可以读取 RC 下在其他事务中被 X 锁定的行(!)。这样就很好地履行了不读取未提交数据的约定。
示例:如果有一个写入 tran 修改了数据库的任何子集,则 100% 肯定 RC 读取器在写入器提交之前不会感知这些更改。
RC 的保证非常弱,通常只能在您基本上不关心数据一致性的情况下使用。
【讨论】:
以上是关于SQL Server ReadCommitted 隔离级别如何真正起作用?的主要内容,如果未能解决你的问题,请参考以下文章
sql server 事务隔离性 snapshot read committed说明