126

async/awaitをサービス バスに統合しようとしています。この例http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspxSingleThreadSynchronizationContextに基づいて実装しました。

そして、1つのことを除いて、正常に動作します: TransactionScope. の中で何かを待っているTransactionScopeと、 が壊れますTransactionScope

TransactionScopeを使用してスレッドに物を格納するため、確かにasync/とうまく機能していないようです。私はこの例外を受け取ります:awaitThreadStaticAttribute

「TransactionScope が正しくネストされていません。」.

タスクをキューに入れる前にデータを保存しTransactionScope、実行する前に復元しようとしましたが、何も変わらないようです。そして、TransactionScopeコードがごちゃごちゃしていて、そこで何が起こっているのかを理解するのは非常に困難です。

それを機能させる方法はありますか?に代わるものはありTransactionScopeますか?

4

4 に答える 4

14

回答には少し遅れましたが、MVC4 で同じ問題が発生していたため、プロジェクトを右クリックしてプロパティに移動し、プロジェクトを 4.5 から 4.5.1 に更新しました。アプリケーション タブを選択し、ターゲット フレームワークを 4.5.1 に変更し、次のようにトランザクションを使用します。

using (AccountServiceClient client = new AccountServiceClient())
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
}
于 2014-05-04T02:26:07.610 に答える
6

Transaction.DependentClone()メソッドによって作成されたDependentTransactionを使用できます。

static void Main(string[] args)
{
  // ...

  for (int i = 0; i < 10; i++)
  {

    var dtx = Transaction.Current.DependentClone(
        DependentCloneOption.BlockCommitUntilComplete);

    tasks[i] = TestStuff(dtx);
  }

  //...
}


static async Task TestStuff(DependentTransaction dtx)
{
    using (var ts = new TransactionScope(dtx))
    {
        // do transactional stuff

        ts.Complete();
    }
    dtx.Complete();
}

DependentTransactionを使用した同時実行の管理

http://adamprescott.net/2012/10/04/transactionscope-in​​-multi-threaded-applications/

于 2012-12-26T00:16:02.083 に答える
0

誰かがまだこのスレッドをフォローしている場合...

Microsoft.Data.SqlClient v3.0.1 は、.NET Framework の async/await 関数での System.Transactions のデッドロックの問題を修正しているようです! 4.8を使用しています。明示的な分散トランザクション メソッドを使用して、複数の接続を使用して単一の SQL サーバーに対して並列クエリを実行できるようにしましたが、TransactionScope での動作も優れていると確信しています。

CommittableTransaction を作成し、親 committable から作成された DependentTransaction を登録する任意の数の SqlConnections を作成し、接続に対して並列にクエリを実行し、クエリの実行後に依存関係を完了してから、親 committable をコミット/ロールバックします。

3つの異なる接続で同じデータベースへの3つの並列非同期挿入でテストしました。親の committable が進行中の間、メッセージ ボックスを使用して commit または rollback を要求しました。分散トランザクションがアクティブな間、テーブルはロックされました。ssms でそれらから選択できませんでした。コミットまたはロールバックを選択すると、どちらも期待どおりに機能しました。

先週の Microsoft.Data.SqlClient 3.0.0 では、非同期関数で .Commit() メソッドがデッドロックするため、これは不可能でした。さまざまな方法で BeginCommit/EndCommit も試しました。依存関係を非同期関数に登録する際にも問題がありましたが、これも修正されています。現在、最も単純な明示的な分散トランザクション メソッドは、async/await で機能します。

于 2021-09-28T00:13:51.757 に答える