2

我正在使用 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 已经被修改。

4

1 回答 1

3

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

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

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

SET TRANSACTION ISOLATION LEVEL (Transact-SQL)

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

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

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

REPEATABLE READ 指定语句不能读取已被其他事务修改但尚未提交的数据,并且...

等等。

于 2012-04-17T22:54:36.473 回答