0

Entity Framework が DTC トランザクションにどのように参加するかについての簡単な (と思う) 質問です。

同じ分散トランザクション内に 2 つの DbContext を作成した場合、最初のコンテキストで保存したデータは、2 番目のコンテキストを介して後続のクエリで使用できますか?

つまり、DTC トランザクション内で、context1 を介してデータを取得、変更、保存し、次に context2 を作成して同じエンティティをクエリします。context1 からのコミットされていないデータは、context2 で使用できますか?

4

2 に答える 2

0

2 番目のコンテキストは、最初のコンテキストによってコミットされた変更を実際に確認できるようです。読み取りコミット分離を使用しています。私は本質的にやっています(疑似コード):

Start Distributed Transaction

Context1: Fetch data into entities
Context1: Change entities
Context1: Save entities

Context2: Fetch data into same entities as used context 1
Context2: Change entities
Context2: Save entities

Commit Distributed Transaction

コンテキスト 2 にフェッチすると、(DTC を介して) コミットされていなくても、コンテキスト 1 に保存された変更が実際に表示されます。

于 2013-02-28T16:48:05.233 に答える
0

それは、使用している分離レベルによって異なります。

DbContexts をTransactionScopeで囲み、 IsolationLevel.ReadUncommitted を指定する場合、たとえば

var options = new TransactionOptions{ IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
using(var scope= new TransactionScope(TransactionScopeOption.Required, options))
{
    ... DbContexts here

    scope.Complete();
}

次に、2 番目のクエリは、最初のクエリによって行われた変更を確認できます。他の分離レベルでは、そうではありません。

SQL Server の既定の分離レベルは Read Committed ですが、TransactionScopeは Serializable です。

いくつかの例については、 http://www.gavindraper.co.uk/2012/02/18/sql-server-isolation-levels-by-example/を参照してください。

于 2013-02-27T23:14:34.407 に答える