2016-09-27 27 views
10

同時実行性の問題があります。エンティティを複数回保存しようとするwhileループで解決しようとしましたが、最大再試行回数に達します。私は、この問題を解決する他の方法があるかどうかについて話してはいけません。私はそれについての他のStackoverflowの投稿があります。 :)ストーリーは短いです:派生した列には一意の制約があり、衝突を避けるためにインクリメントし続ける数値部分が含まれています。ループでは、I:JPA並行性の問題「バッチのリリース時にまだJDBCステートメントが含まれています」

  1. 選択最大(some_value)
  2. インクリメント結果
  3. が明示的にそれが理由で失敗した場合、エンティティをフラッシュし、この新しい結果で新しいオブジェクトを保存する
  4. の試みユニークなインデックス、私はDataAccessExceptionをキャッチします。

このすべては、ループがステップ1に戻り、選択しようとする場合を除いて動作しているようですが、私が取得:

17:20:46,111 INFO [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (http-localhost/127.0.0.1:8080-3) HHH000010: On release of batch it still contained JDBC statements 
17:20:46,111 INFO [my.Class] (http-localhost/127.0.0.1:8080-3) MESSAGE="Failed to save to database. Will retry (retry count now at: 9) Exception: could not execute statement; SQL [n/a]; constraint [SCHEMA_NAME.UNIQUE_CONSTRAINT_NAME]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement" 

また、新しい例外がキャッチされます。一意の制約違反を引き起こす最初のフラッシュのようで、DataAccessExceptionはエンティティマネージャのバッチをクリアしません。これに対処する適切な方法は何ですか?私はJPAでSpringを使用しており、エンティティマネージャに直接アクセスすることはできません。私はそれが必要な場合私はそれを注入することができると思うが、それはこの問題に痛い解決策です。

答えて

5

あなたはそれを行うことはできません。何かを一度フラッシュして失敗し、例外がスローされると、トランザクションはロールバックとしてマークされます。つまり、例外をキャッチして処理を続行すると、ロールバックになります。 実際に例外がスローされたのはまったく問題ありません。デフォルトでは、Springのトランザクションマネージャは、のチェックを外して、すべての例外をロールバックします。あなたは、特に(アノテーションドライバーのトランザクションを使用している提供)@TransactionalアノテーションのnoRollbackFor

編集を定義することによって、それを克服することができます - トランザクションはおそらくマークされますので、それはまた、この制約違反の場合には、あなたを助けにはなりませんデータベースレベルでロールバックします。

関連する問題