2

EF でトランザクションを管理するために TransactionScope を使用しています。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();
}

2 番目のインスタンスを取得するときにまだトランザクションをコミットしていませんが、FirstName は既に変更されています。

4

1 に答える 1

3

あなたは同じトランザクションの中にいます。トランザクション分離レベルは、さまざまなトランザクションを指します。

翻訳をそれ自体から分離することはできませんが、他の異なるトランザクションから分離することはできません。

2 つの異なるトランザクション スコープ (つまり、2 つのアプリを同時に実行) を開いてみると、それらの間の os 分離の効果がわかります。2 つの異なるアプリを同時にデバッグし、スコープをコミットする前にそれらを一時停止することができます。

SET TRANSACTION ISOLATION LEVEL (Transact-SQL) を見てください。

おわかりのように、各トランザクション分離レベルが説明されるとき、それは常に他のトランザクションを指します:

READ UNCOMMITTED ステートメントが、他のトランザクションによって変更されたがまだコミットされていない行を読み取ることができることを指定します。

READ COMMITTED ステートメントが、他のトランザクションによって変更されたがコミットされていないデータを読み取ることができないことを指定します。

REPEATABLE READ 他のトランザクションによって変更されたがまだコミットされていないデータをステートメントが読み取ることができないことを指定します。

等々。

于 2012-04-17T22:54:36.473 に答える