私は .NET 2.0 と SQL Server 2005 を使用しています。歴史的な理由から、アプリ コードは SQLTransaction を使用していますが、一部のストアド プロシージャは T-SQL の begin/commit/rollback tran ステートメントも使用しています。DBTransaction は多くのストアド プロシージャにまたがることができ、個々の sproc がそのスコープ内で何が起こっているかを制御します。実際には、これらはネストされたトランザクションです。
コードの古い動作では、いずれかの sproc が失敗すると、アプリケーション ロジックによって外側の SQLTransaction もロールバックされます。しかし、ここでロジックを変更して、障害が発生した場合でも、外側のトランザクションが残りの sproc をそのシーケンスで実行し続け、最後に、障害があったことがわかっているので、SQLTransaction 全体をロールバックします。
問題は、少なくとも現在コーディングされているように、いずれかの sprocs が ROLLBACK を実行すると、外側の SQLTransaction が接続を失ったように見えるため、その後のトランザクションの再利用の試みが失敗することです。T-SQL でロールバックする方法はありますが、外部の SQLTransaction は維持できますか? ここでセーブポイントが役立つのではないかと思っていましたが、まだよくわかりません。
この状況を複雑にしているのは、外部トランザクションが常に存在するとは限らないため、T-SQL ロールバックを単純に削除できないことです。場合によっては、sproc が単独で実行されます。時にはトランザクションのコンテキストで。
TransactionScope に切り替えると作業が簡単になりますか?
提案をありがとう...マイク