3

Entity Framework の ObjectContext.Connection.BeginTransaction() メソッドが返すトランザクションが MSDTC (Microsoft Distributed Transaction Coordinator) のサポートを使用しているかどうかを確認したいですか?

MSDTC のサポートなしでトランザクションを使用する方法はありますか?

4

1 に答える 1

5

特定の条件下で、MSDTC によって調整されたトランザクションに自動的に昇格します。スコープ内にまだトランザクションがない場合は、呼び出すたびObjectContext.SaveChanges()に新しいトランザクションが作成されます (スコープ内にアクティブなトランザクションが既にある場合は、そのトランザクションに参加します)。ただし、デフォルトでは、 を呼び出すたびに接続も開いたり閉じたりしますObjectContext.SaveChanges()。したがってObjectContext.Connection.BeginTransaction()、メソッドの先頭で呼び出している場合は、ObjectContext.SaveChanges()元のトランザクションを保持している間に複数回、SQL Server と Entity Framework の一部のバージョンでは、トランザクションが MSDTC に昇格する可能性があります。これは、単一のトランザクション内で異なる接続が使用されるようになったためです。トランザクションが MSDTC に昇格するのを回避しようとしている場合は、最初に明示的に接続を開き、完了したら閉じます。

using(MyEntities context = new MyEntities())
using(DbConnection conn = context.Connection)
{
    conn.Open();
    DbTransaction transaction = conn.BeginTransaction();

    // now do stuff within the transaction scope

    transaction.Commit();
}

ただし、TransactionScope を使用することをお勧めします。これは、柔軟性が高く、プラットフォームへの依存度が低く、将来、MSDTC を必要とするものが実際に必要であると判断した場合に容易になるためです。アクティブな TransactionScope がある場合、EntityFramework は自動的にトランザクションに参加します。

using(TransactionScope transaction = new TransactionScope())
using(MyEntities context = new MyEntities())
using(DbConnection conn = context.Connection)
{
    conn.Open();

    // now do stuff within the transaction scope

    transaction.Complete();
}
于 2011-07-28T14:46:47.083 に答える