web-dev-qa-db-ja.com

分散トランザクションが完了しました。このセッションを新しいトランザクションまたはNULLトランザクションに参加させます

他の誰かがこの特定のエラーを持っていて、それを解決する方法を知っているかどうかだけ興味がありますか?

シナリオは次のとおりです...

Windows Server2008で実行されているエンタープライズライブラリを使用するASP.NETWebアプリケーションがありますIISファームはSQLServer2008クラスターバックエンドに接続しています。MSDTCがオンになっています。DB接続はプールされています。

私の疑いは、どこかで失敗したMSDTCトランザクションがあり、接続がプールに戻され、別のページの次のクエリが誤動作している接続を取得し、この特定のエラーが発生したことです。面白いことに、分散トランザクション(2つのデータベースへのコミットなど)ではまったく必要のないクエリでこのエラーが発生しました。エラーが発生したときは、選択クエリ(トランザクションなし)のみを実行していました。

SQLプロファイリングを実行し、クエリはSQL Serverで実行されましたが、戻ってきませんでした(MSDTCトランザクションが接続ですでに中止されているため)。

これに伴うその他の関連エラーは次のとおりです。

  • 新しいリクエストは、有効なトランザクション記述子が付属している必要があるため、開始できません。
  • 内部.NetFrameworkデータプロバイダーエラー60。
23
Jimmy Chandra

MSDTCにはデフォルトで90秒のタイムアウトがあり、1回のクエリ実行がこの制限時間を超えると、トランザクションがコミットしようとしたときにこのエラーが発生します。

4
Russel Yang

賞金はあなたが求める答えを得るのに役立つかもしれませんが、いくつかのコードサンプルを与え、エラーがいつ発生するかについてより良い説明を与えると、おそらくより良い答えを得るでしょう。

エラーは断続的にのみ発生しますか?あなたの説明からそれのように聞こえます。

Microsoftが推奨するように、トランザクションとして実行するクローズをusing TransactionScopeブロックで囲んでいますか?これは、奇妙なトランザクション動作を回避するのに役立つはずです。 usingブロックは、スローされた例外に関係なく、オブジェクトが常に破棄されることを保証することを思い出してください。ここを参照してください: http://msdn.Microsoft.com/en-us/library/ms172152.aspx

TransactionScopeを使用している場合、このコードブロックに対して常に新しいトランザクションを作成するようにフレームワークに指示する引数System.TransactionScopeOption.RequiresNewがあります。

    Using ts As New Transactions.TransactionScope(Transactions.TransactionScopeOption.RequiresNew)
        ' Do Stuff
    End Using

また、接続に障害が発生している疑いがあり、接続プールに戻された場合、考えられる解決策は、接続に障害が発生する可能性のあるコードをTry-CatchブロックとDispose接続に含めることです。キャッチブロックで。

古い質問...しかし、過去数日間この問題に遭遇しました。

今まで良い答えを見つけることができませんでした。私が見つけたものを共有したかっただけです。

私のシナリオには、複数のセッションファクトリによって開かれている複数のセッションが含まれています。正しくロールバックして待機し、他のトランザクションがアクティブでなくなったことを確認する必要がありました。それらの1つをロールバックするだけで、すべてがロールバックされるようです。

ただし、ロールバックの間にThread.Sleep()を追加した後は、他のことは行わず、ロールバックを続行します。メソッドをトリガーする後続のヒットは、「有効なトランザクション記述子が付属している必要があるため、新しいリクエストの開始は許可されていません」という結果にはなりません。エラー。

https://Gist.github.com/josephvano/5766488

1
Joey V.

私は以前にこれを見たことがあり、原因はまさにあなたが思っていたものでした。 Riceが提案したように、この問題を回避するために、db関連オブジェクトを正しく破棄していることを確認してください。

0
Mike