带有 ReadCommit 标志的事务范围仍返回未提交的数据

本文关键字:返回 提交 数据 范围 ReadCommit 标志 事务 带有 | 更新日期: 2023-09-27 18:31:38

我正在使用TransactionScope来管理EF中的事务,我需要ReadCommited行为,但它没有按预期工作:

using (var trans = new TransactionScope(TransactionScopeOption.Required, 
                            new TransactionOptions() 
                                { IsolationLevel = IsolationLevel.ReadCommitted}))
{
    var c1 = customerRepository.Get(1);
    c1.FirstName = "Modified";
    customerRepository.Save();
    var c2 = customerRepository.Get(1);
    Assert.AreNotEqual("Modified", c2.FirstName);
    trans.Complete();
}

虽然我在获取第二个实例时仍然没有提交事务,但它的 FirstName 已经被修改了。

带有 ReadCommit 标志的事务范围仍返回未提交的数据

你们在同一个事务中。事务隔离级别是指不同的事务。

您不能将翻译与自身隔离,而是将其他不同事务的翻译隔离开来。

尝试打开两个不同的事务范围(即同时运行两个应用程序),您将看到它们之间的操作系统隔离效果。可以同时调试两个不同的应用,并在提交范围之前暂停它们。

查看设置事务隔离级别 (事务处理 SQL)

如您所见,当解释每个事务隔离级别时,它总是引用其他事务:

读取未提交 指定语句可以读取已被其他事务修改但尚未提交的行。

已提交读取 指定语句不能读取已修改但未由其他事务提交的数据。

可重复读取 指定语句不能读取已修改但尚未由其他事务提交的数据,并且...

等等。