3

EntityFrameworkを使用するWebアプリケーションがあります。TransactionScopeクラスを使用してアンビエントトランザクションを提供します。

DTCトランザクションよりも標準のT-SQLトランザクションを使用するようにEFに指示する方法はありますか?1つのEntityContextと1つのTransactionScopeインスタンス内のさまざまなテーブルに対して多くのクエリを実行することがよくありますが、これは常にトランザクションをDTCにプロモートするようです。

簡単な例をまとめました。以下を参照してください。個々のテーブルへのクエリはT-SQLトランザクションを正しく開始し、接続SPID 54にありました次にContactUsテーブルへのクエリが行われ、EFはトランザクションを促進する効果がある別の接続(SPID 53)でこれを行いますDTCトランザクションに。**

using (MyEntities DB = new MyEntities())
{
    using (TransactionScope t = new TransactionScope())
    {
        DB.Individual.First().EmailAddress = "bob" + DateTime.Now.Second.ToString() + "@bob.com"; // done on connection 54
        DB.ContactUs.First(); // done on connection 53 thus promoting the transaction!!
        DB.SaveChanges();
        t.Complete();
    }
}
4

4 に答える 4

7
  1. トランザクションでの自動登録を回避するには、接続文字列にEnlist=falseを設定します。

  2. トランザクションスコープの参加者として接続を手動で参加させます。(http://msdn.microsoft.com/en-us/library/ms172153%28v=VS.80%29.aspx)

于 2010-08-04T17:44:02.087 に答える
4

言及していませんが、SQL Server 2005を使用しているようです。SQLServer2005では、TransactionScope内で複数の接続が開かれると、トランザクションは 軽量トランザクションから分散トランザクションにエスカレートします。それが同じデータベースで同じConnectionStringであるかどうかは関係ありませんが、それでもプロモートされます。

これは、System.Transactionsの既存の動作であるため、EntityFrameworkの「問題」ではありません。この問題は、通常のADO.NETにも存在します。過去に私はエンタープライズライブラリを使用しました。エンタープライズライブラリは、トランザクションに参加している接続のリストを保持しています。トランザクション中に新しい接続を取得しようとすると、すでに開いていて、参加している接続が返されます。取引。

SQL Server 2008を使用すると、同じデータベースへの複数の接続を開いたときにトランザクションがプロモートされないように動作が改善されます。

于 2010-01-08T23:15:35.630 に答える
1

分散トランザクションの使用を引き起こしているのは Entity Framework ではありません。むしろそうですTransactionScope。EF は、「通常の」トランザクションを使用して、 への 1 回の呼び出しのコンテキストで実行されるすべての SQL ステートメントをまとめますSaveChanges()。あなたが与える例では、への呼び出しは1つだけですSaveChangesTransactionScopeしたがって、変更をアトミックに適用するために を使用する必要はまったくありません。

TransactionScope非分散トランザクションを使用する方法はわかりませんが、これを行っているのは Entity Framework ではないと確信しています。

于 2010-01-08T13:00:00.040 に答える
0

ASP.NETメンバーシップシステムでEntityFrameworkを使用すると、2つが異なる接続文字列を使用するため、DTCエスカレーションの問題が発生していました。メンバーシップシステムの接続文字列に「Enlist=false」を設定すると、問題が解決しました。

于 2012-09-27T12:04:27.280 に答える