【问题标题】:SQL Server - inconsistent behavior when reading uncommitted changes of the same transactionSQL Server - 读取同一事务的未提交更改时的不一致行为
【发布时间】:2009-04-22 11:02:11
【问题描述】:

使用具有隔离级别“已提交快照”的 SQL 服务器,我们会定期将数据写入数据库并在同一事务的上下文中进一步读取。通常从数据库中读取时,我们会看到我们自己未提交的更改,但只有其他人所做的已提交更改。我们假设这是预期的行为。

我们现在发现,在一些相对罕见的情况下,我们看不到我们写入的值 - 只看到以前提交的值。

任何想法可能导致不一致?

【问题讨论】:

    标签: sql-server transactions snapshot-isolation


    【解决方案1】:

    有一些关于可能出错的好文章。也许他们会有所帮助

    Craig Freedman, Serializable vs. Snapshot Isolation Level 黑色/白色大理石类比

    Hugo Kornelis, 4 articles "Snapshot isolation: A threat for integrity":DRI/FK 默默地更改为不同的隔离级别

    【讨论】:

    • 不错的文章,但没有讨论读取同一事务中修改的数据的问题。
    • 第 1 篇文章提到了黑色/白色大理石。你在回滚吗?第二四个提到 FK 改变隔离级别。在同一个 TXN 中,如果您正在读取自己提交的更改前数据,那么它是否已回滚?或者您的隔离级别已更改...这可能会造成混淆,因此您可以阅读自己的更改前提交的数据
    • 我的问题与回滚无关(见单独答案)
    【解决方案2】:

    事实证明,这是 SQL Server 中已知的不一致性:当您从数据库中读取时,您通常会看到自己的事务未提交的更改(在所有隔离级别中),但这并不总是得到保证。在我的情况下,解决方法是使用with (readuncommitted),信任一种应用程序级锁定机制,可以防止对相同数据的并发修改。

    我从两位独立的数据库专家那里得到了相同的答案。不幸的是,我没有找到任何关于这个问题的书面参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 2018-04-27
      • 2019-03-12
      • 2018-01-15
      • 2014-10-19
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多