0

データ アクセス操作に NHibernate を使用する NServiceBus ハンドラを実行すると、注意する必要があるかどうかわからないエラーが表示されます。

ハンドラーには、次のようなコードがあります。

using (var tx = Session.BeginTransaction()) 
{
    var accountGroup = _groupRepository.FindByID(message.GroupID);
    accountGroup.CreateAccount(message.AccountNumber);

    tx.Commit();
}

このプロセスをプロファイリングすると、次の行が表示されます。

  • 分離レベル: Serializable の分散トランザクションに登録されたセッション
  • 分離レベルでトランザクションを開始: 未指定
  • SELECT ... FROM AccountGroups this_ WHERE this_.ID = 123
  • アカウントに挿入...
  • トランザクションをコミットする
  • トランザクションをコミットする

tx.Commit() を呼び出すと、最初のコミット メッセージがコードによって生成されます。2 番目のコミット メッセージは、ハンドラーの Handle メソッドを終了したときに発生し、NServiceBus によって呼び出されると思います。この commit の 2 回目の呼び出しにより、NHProf で「複数のスレッドで単一のセッションを使用することはおそらくバグです」というアラートが生成されます。

その時点でコミットすることは本当に何もないので、これは問題ではないと思いますが、ここで不適切なことをしていますか? トランザクション内でコードを実行したいのですが、実行するとこのアラートが表示されます。

何か案は?

4

1 に答える 1

2

これは問題ではありません。何が起こっているかというと、DTC コミットが別のスレッドで発生していることを NH Prof が検出したことです。実際には DTC コミットを適切に処理する必要があるため、何が起こっているのかわかりません。推測では、DTC コミットと標準コミットの両方を使用すると混乱します。私はそれを修正します。

于 2010-04-07T07:32:56.483 に答える