6

実際にバランスの取れたトランザクション ブロックを持つストアド プロシージャでこの例外が発生しましたか?

ストアド プロシージャを再確認したところ、正確に 1 つのTRANSACTION BEGIN対応するプロシージャが含まれています。TRANSACTION END

エラーがログに記録されました

SqlException - Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0.  The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION. - Delete failed - stack:    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)     at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)     at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)     at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)     at System.Data.SqlClient.S ... [Rest of stack trace truncated by logging system]`

追加情報

EXECストアド プロシージャには、別のストアド プロシージャへの呼び出しが含まれています。ここでトランザクション ペアが一致しないと、このようにエラーが発生するのでしょうか?

更新 ネストされたストアド プロシージャ内で外部キー制約違反があったことが判明しました。外部トランザクションに Try/Catch ブロックが含まれておらSET XACT_ABORT ONず、指定されていたため、コミットまたはロールバックが適切に処理されませんでした。また、ロールバックを試みる前に @@TransactionCount > 0 のチェックを追加しました

4

5 に答える 5

14

はい、そうです。各 BEGIN は をインクリメント@@trancountし、各コミットはそれをデクリメントします。カウントが 0 になった場合にのみ、トランザクションは実際にコミットされます。呼び出し元としてのプロシージャは、これを制御できません。呼び出されたプロシージャが適切に動作し、BEGIN と COMMIT のカウントのバランスをとるのは、呼び出されたプロシージャの仕事です。呼び出されたプロシージャのいずれかに不均衡がある場合、このエラーが表示されます。

于 2010-09-16T17:01:30.350 に答える
6

これを生成するパスがありませんか

BEGIN TRAN

ROLLBACK TRAN

COMMIT TRAN
于 2010-09-16T17:04:27.953 に答える
2

はい、あなたは正しい道を進んでいます。入れ子になったプロシージャ コールによってトランザクションが作成される場合、それらは呼び出し元のプロシージャに影響します。

その他の手続きを確認する

于 2010-09-16T17:00:49.730 に答える
1

うっかり書いてしまわないように

 return
 commit

代わりに

 commit
 return

私にとっては、それが問題でした。

于 2014-10-28T17:36:54.637 に答える
0

これを PROCEDURE 作成テキストの上に追加します

XACT_ABORT をオンに設定します。

何も実行されなかった場合、トランザクションは完全に中止されます。

MSDN ドキュメント: http://technet.microsoft.com/en-us/library/ms188792(v=sql.105).aspx

于 2013-12-03T12:48:34.323 に答える