1

いくつかの DataContext を新しく作成し、いくつかのデータを読み取り、SubmitChanges のみを TransactionScope にラップするとどうなりますか?

string conn1 = GetConn1();
string conn2 = GetConn2();
using (DataContext1 dc1 = new DataContext1(conn1))
{
  List<Customer> customers = ReadSomeData(dc1);
  ModifySomeCustomers(customers);  //performs local modification to Customer instances

  using (DataContext2 dc2 = new DataContext2(conn2))
  {
    List<Order> orders = ReadSomeData(dc2);
    ModifySomeOrders(orders); //performs local modification to Order instances

    using (TransactionScope scope = new TransactionScope())
    {
      dc1.SubmitChanges();
      dc2.SubmitChanges();
      scope.Complete();
    }
  }
}

最初の SubmitChanges 呼び出しは、プールから接続をフェッチし、その接続をスコープに登録することが期待されています。MS DTC が有効になっている - 2 回目の SubmitChanges 呼び出しは、トランザクションを「分散」に昇格させ、プールから接続を取得し、その接続をスコープに登録することが期待されます。

ReadSomeData が接続を開いたままにしている可能性があるため、SubmitChanges はプールから接続をフェッチしないため、スコープに接続を登録しません。

4

1 に答える 1

2

SubmitChangesに参加しTransactionScopeます。

SubmitChangesアンビエントトランザクションが見つかった場合は、そのトランザクションに参加します。それ以外の場合は、SubmitChangesメソッドの存続期間中、トランザクション自体を作成します。

にトランザクション処理に関するMSDNの記事がありSubmitChangesます。

于 2012-07-27T18:58:40.400 に答える