0

で注釈が付けられた単一のサービスメソッドがありPropagation.Requiredます。3つの別々の操作を実行します。

  1. テーブル1にレコードがない場合は、テーブルzからテーブル1に挿入します。
  2. ユーザーの編集/追加に従ってテーブル1を挿入/更新します
  3. テーブル1からxレコードを削除します

私の無知を許してください、しかしこれらすべてが単一のトランザクションの下で実行されるべきではありませんか?ある意味で、3番目のクエリで例外が発生した場合、1番目と2番目のロールバックも実行すべきではありませんか?私の場合、これは起こりません。休止状態の自動コミット設定は、txn境界に何らかの影響を及ぼしますか?私の場合、自動コミットはtrueに設定されています。私が必要としているのは、すべてが成功した場合にのみ、これらのテーブルのいずれかでコミットを実行する必要があるということです。

4

3 に答える 3

1

サービス層よりも上位の層をもう 1 つ追加して、そこからトランザクションを開始してみてください。

于 2010-11-22T11:11:34.213 に答える
0

はい、Hibernateconnection.autocommitプロパティ設定はトランザクション境界に影響します。

これをに設定するとtrue、Hibernateは基盤となるJDBC接続を自動コミットモードにします。これにより、実行する各ステートメントが独自のデータベーストランザクションでラップされます。

したがって、たとえば、3番目のクエリ/ステートメントが失敗した場合、3番目のクエリ/ステートメントのみがロールバックされます。

3つすべてを単一のユニットとして実行するには、自動コミットをオフにして、宣言型またはその他の単一のトランザクションのコンテキストで3つすべてを実行する必要があります。

于 2010-12-30T09:44:15.080 に答える
0

自動コミットをオンにしたくないことは間違いありません。それはおそらくすべての操作の後にコミットされます。自動コミットをオフにして、最後に明示的なコミットを追加します。

于 2010-11-22T11:57:50.903 に答える