1

(DTC を取り巻く状況と取引の促進は、知らない人にとっては少し不可思議なことかもしれませんが、私の会社がどのように物事を行っているかをお見せしましょう。また、DTC が関与している理由を教えていただければ幸いです。 、可能であれば、それを回避するために何ができるか、感謝します.)

ASP.Net Web サーバーでコードを実行しています。データベースは 1 つ、SQL 2008 です。

データ アクセス コードは次のようになります。SQLConnections と SQLCommands のラッパー オブジェクトを使用するデータ アクセス層があります。典型的な使用法は次のようになります。

void method1()
{
    objDataObject = new DataAccessLayer();
    objDataObject.Connection = SomeConnectionMethod();
    SqlCommand objCommand = DataAccessUtils.CreateCommand(SomeStoredProc);

//create some SqlParameters, add them to the objCommand, etc....

objDataObject.BeginTransaction(IsolationLevel.ReadCommitted);
objDataObject.ExecuteNonQuery(objCommand);
objDataObject.CommitTransaction();
objDataObject.CloseConnection();
}

実際、SqlClient、SqlConnection などの非常に薄いラッパーです。トランザクションでいくつかのストアド プロシージャを実行したいのですが、ラッパー クラスでは SqlTransaction にアクセスできないため、あるコンポーネントから次のコンポーネントに渡すことができません。 . これにより、TransactionScope を使用するようになりました。

using (TransactionScope tx1 = new TransactionScope(TransactionScope.RequiresNew))
{
  method1();
  method2();
  method3();
  tx1.Complete();
}

これを行うと、DTC が関与します。残念ながら、私たちの Web サーバーでは、MSDTC 設定で「リモート クライアントを許可する」が有効になっていません。

DTC の関与を避けたいのですが、できますか? Methods1-3() のトランザクション呼び出しを省略して、TransactionScope にすべてを理解させることはできますか?

4

2 に答える 2

1

何をしSomeConnectionMethod()ますか?method1()method2()およびで同じ接続が返されない場合method3()は、分散トランザクションがあります。そのため、DTC はこの取引の調整に関与します。

したがって、SomeConnectionMethod()DTC がトランザクションに関与しないようにするには、同じ接続を返す必要があります。

于 2009-12-12T07:15:16.990 に答える
0

なぜ機能しないのか:

同じ接続を共有する場合でも(larryqが提案するように)、DTCを関与させないと機能しないと思います。

Transactionスコープでこれらのメソッドをラップする必要があります。

  • method1
    • トランを始める
    • トランをコミット
  • method2
    • トランを始める
    • トランをコミット
  • method3
    • トランを始める
    • トランをコミット

それぞれの方法で、開始してコミットします。method3で問題が発生した場合は、method1&2から既にコミットされているトランザクションを含め、すべてをロールバックする必要があります。これを行うには、3つのメソッドすべてにまたがるDTCトランザクションが必要です

私が間違っている場合は訂正してください。ただし、メソッド内でトランザクションを開始およびコミットしない場合にのみ、TransactionScopeを使用し、DTCの使用を回避できると思います。

どのように機能しますか:

本当にbeginとcommitでトランザクションを使用する必要がありますか?あなたは次のようなことをすることはできません:

using (var scope = new TransactionScope(TransactionScopeOption.Required)) {
   objDataObject.ExecuteNonQuery(objCommand);
}

RequiredNewではなくScopeRequiredは、既存のトランザクションがすでに存在する場合はそれを使用します

何か問題があった場合は、遠慮なく訂正してください。

于 2010-03-20T14:12:54.177 に答える