自動コミットと Spring 宣言型トランザクション
-
27-09-2019 - |
質問
注釈が付けられたサービス メソッドが 1 つあります Propagation.Required
. 。3 つの別々の操作を実行します。
- テーブル 1 にレコードがない場合は、テーブル z からテーブル 1 に挿入します。
- ユーザーの編集/追加に従ってテーブル 1 を挿入/更新します
- テーブル 1 から x レコードを削除します
私の無知を許してください。しかし、これらすべては単一のトランザクションで実行されるべきではないでしょうか?つまり、3 番目のクエリで例外が発生した場合、1 番目と 2 番目のクエリもロールバックすべきではないでしょうか。私の場合はそんなことは起こりません。Hibernate auto commit 設定は txn 境界に何らかの影響を与えますか?私の場合、自動コミットは true に設定されています。私が要求しているのは、すべてが成功した場合にのみ、これらのテーブルのいずれかでコミットが行われる必要があるということです。
解決
はい、Hibernateのconnection.autocommit
プロパティの設定は、トランザクション境界に影響します。
あなたはtrue
に設定すると、Hibernateはあなたが独自のデータベース・トランザクションで実行し、各ステートメントをラップする自動コミットモードでの基礎となるJDBC接続を配置します。
ですから、例えば、唯一のあなたの第三クエリが/文はロールバックされます。
は、単一のユニットとして、3つすべてを実行するには、あなたがそれ以外の場合は、宣言や、オフ自動コミットを持っており、単一のトランザクションのコンテキストですべての3つを実行する必要があります。
他のヒント
あなたは、より高いサービス層より1層を追加して、そこからトランザクションを開始しようとすることができます。
あなたは間違いなく上の自動コミットをしたくありません。それはおそらく、すべての操作の後にコミットします。スイッチがオフに自動コミット、および終了時にコミット明示的に追加します。