web-dev-qa-db-ja.com

「EXECUTE後のトランザクション数がBEGINとCOMMITステートメントの数の不一致を示している」の処理

私たちのシステムは突然失敗し始めました:

EXECUTE後のトランザクション数は、BEGINステートメントとCOMMITステートメントの数が一致しないことを示しています。

サービスパックやその他のインストールの変更はなく、データは本質的に変更されていません。

これは、ネストされたストアドプロシージャとトリガーを含むドキュメントのないレガシーシステムであり、XACT_ABORT ONとIF @@ TRANCOUNT> 0 ROLLBACKを持つものもあります。

一時的な修正を行うために、エラーを無視して手順を続行したいのですが、CATCHで検出されません。

このエラーをキャッチして処理する方法はありますか?不適切に記述されたネストされたトランザクションが異なる動作を開始する可能性がある理由はありますか?接続のデフォルトが変更されていないことを確認しました。

Microsoft SQL Server 2012-Windows NT 6.3(Build 9600:)上の11.0.5343.0(X64)Standard Edition(64ビット)(ハイパーバイザー)

2
cloudsafe

このエラーをキャッチして処理する方法はありますか?

いいえ、これはあなたの問題ではありません。一部のその他エラーがあり、エラー時にロールバックするようにストアドプロシージャがコーディングされています。トランザクションを開始しなかったストアドプロシージャでROLLBACKを実行するとalsoエラーとなり、このメッセージが生成されます。

前のエラーを確認する必要があります。 ROLLBACKの前に、プロシージャはRAISERRORまたはTHROWを呼び出して、基になるエラーの詳細をクライアントに返す必要があります。 SSMSでは両方のエラーメッセージが表示され、Visual StudioのデバッグではSqlExceptionに Errors のコレクションが含まれているため、問い合わせることができます。ただし、他のクライアントでは、最後のエラーメッセージのみが表示される場合があります。

そうでない場合は、そうする必要があります。また、「エラーと警告」/「ユーザーエラーメッセージイベント」または同様のXEventを使用して、プロファイラーを使用してそれを確認できます。