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 事务隔离级别详解

sql server 事务隔离性 snapshot read committed说明

Sql Server 视图是不是始终是最新的?

SQL Server死锁排查经历 -基于SqlProfiler

sqlserver锁表机制

sql 优化