こんにちは、Spring Ibatis と mysql を使用して Web アプリケーションを構築しています。
mysql ストアド プロシージャを使用し、ibatis で呼び出します。私の質問は、トランザクションを管理する方法についてです。ストアド プロシージャ内でトランザクションを管理する必要がありますか、それとも spring/ibatis を使用するか、またはその両方を使用する必要がありますか?
Ibatis とストアド プロシージャを非常にうまく使用してきたので、このアプローチに問題はありません。
Ibatis は、パラメータを変更データ プロシージャに便利に渡し、データ取得プロシージャの結果セットを適切に処理するのに最適です。
プロシージャが選択した場合、Ibatis は複数の結果セットの出力を処理することもできます。
トランザクション側: 依存します。アプリが自動コミット モードで通常は問題なく実行できるが、トランザクションが必要ないくつかの異なる proc がある場合は、proc-managed が機能する可能性があります。トランザクションを必要とするものはすべて単一の「親」プロシージャによって調整されるようにアプリを設計できます。それが特に立派なパターンだと言っているわけではありませんが、妥当な範囲で機能する可能性があります.
これが適切でないと思われる場合、Spring 管理のトランザクションは、初日から実装するのに間違いなく適切な選択であり、アプリと共に適切に成長する可能性が最も高いアプローチです。
最終的な考え - トランザクションのネストに注意してください。つまり、アプリ/Spring トランザクション管理を使用している場合は、procs にどのトランザクション処理を入れても、アプリケーション側から COMMIT するまで、それらの「内部」コミットは「適切に」コミットされません (それらには用途がありますが、それは私がここで説明する以上のものです)。
編集 - これを書いて以来、異なる DB が COMMIT のネストを異なる方法で処理することを学びました。特に Oracle は入れ子に関係なく COMMIT を COMMIT として扱うようです。そのため、それ以外の場合はアプリ管理のトランザクション内でコミットする proc は適切にコミットされます。
ストアド プロシージャを使用している理由がわかりません。あなたがそうなので、iBatis があなたに何を買っているのかわかりません。
このアプリを作成する場合、Spring と iBatis、または Spring とストアド プロシージャのいずれかを使用しますが、両方を使用することはありません。
Spring を使用してトランザクションを管理し、ストアド プロシージャにトランザクション ロジックを配置しないようにします。