6

System.Transactions.TransactionScope例外がスローされ、最も外側のスコープでコミットが呼び出されなかったにもかかわらず、どのような状況でコードが静止コミットにラップされる可能性がありますか?

にラップされたトップレベルのメソッドがあり、同じようにusing (var tx = new TransactionScope())使用するメソッドを呼び出します。TransactionScope

関連付けられたテーブルアダプターで型指定されたデータセットを使用しています。何らかの理由で、アダプターのコマンドが登録されていない可能性がありますか? アンビエント TransactionScope に参加しているかどうかを確認する方法を知っている人はいますか?

4

4 に答える 4

9

TransactionScope答えは、オブジェクトのにオブジェクトを作成していたためであることが判明しましたSqlConnection

私はこれから移動しました:

using (new ConnectionScope())
using (var transaction = new TransactionScope())
{
    // Do something that modifies data

    transaction.Complete();
}

これに:

using (var transaction = new TransactionScope())
using (new ConnectionScope())
{
    // Do something that modifies data

    transaction.Complete();
}

そして今、それは動作します!

したがって、この話の教訓は、TransactionScope 最初のを作成することです。

于 2009-11-10T16:16:32.117 に答える
2

明らかなシナリオは、新しい(RequiresNew)/ null(Suppress)トランザクションが明示的に指定されている場合ですが、接続がトランザクションを見逃す原因となるタイムアウト/バインド解除の不具合もあります。この以前の投稿(修正は単なる接続文字列の変更です)、または完全な詳細を参照してください

于 2009-11-10T12:37:24.407 に答える
0

TransactionScopeどのように機能するかに注意してください。スコープの使用の開始時に
プロパティを設定System.Transactions.Transaction.Currentし、スコープの使用の終了時に以前の値に戻します。

以前の値は、指定されたスコープが宣言されている場所によって異なります。別のスコープ内にある可能性があります。


次のようにコードを変更できます。

using (var sqlConnection = new ConnectionScope())
using (var transaction = new TransactionScope())
{
    sqlConnection.EnlistTransaction(System.Transactions.Transaction.Current);
    // Do something that modifies data
    transaction.Complete();
}

コードが複雑で、単純にコードを変更して最初に DB 接続を開くことができない人のために、この可能性を示します。

于 2014-05-23T09:31:49.287 に答える