使用具有隔离级别“读取提交快照”的 SQL 服务器,我们经常将数据写入数据库并在同一事务的上下文中进一步读取它。通常从数据库中读取时,我们会看到我们自己未提交的更改,但只有其他人所做的已提交更改。我们假设这是预期的行为。
我们现在发现,在一些相对罕见的情况下,我们看不到我们已经写入的值——只有以前提交的值。
任何想法可能导致不一致?
使用具有隔离级别“读取提交快照”的 SQL 服务器,我们经常将数据写入数据库并在同一事务的上下文中进一步读取它。通常从数据库中读取时,我们会看到我们自己未提交的更改,但只有其他人所做的已提交更改。我们假设这是预期的行为。
我们现在发现,在一些相对罕见的情况下,我们看不到我们已经写入的值——只有以前提交的值。
任何想法可能导致不一致?
有一些关于可能出错的好文章。也许他们可能会有所帮助
Craig Freedman,Serializable vs. Snapshot Isolation Level 黑色/白色大理石类比
Hugo Kornelis,4 篇文章“快照隔离:对完整性的威胁”:DRI/FK 默默地更改为不同的隔离级别
事实证明,这是 SQL Server 中已知的不一致:当您从数据库中读取时,通常会看到您自己的事务未提交的更改(在所有隔离级别中),但这并不总是得到保证。在我的情况下,解决方法是使用with (readuncommitted)
, 信任一种应用程序级锁定机制,以防止对相同数据的并发修改。
我从两位独立的数据库专家那里得到了同样的答案。不幸的是,我没有找到任何关于这个问题的书面参考。