[解決済み] JPA並行処理問題 "バッチリリース時にJDBC文が残っていた" について
質問
あるエンティティの保存を最大再試行回数に達するまで何度も試みるwhileループで解決しようとした並行処理の問題があります。この問題を解決する他の方法があるかどうかについての話は避けたいと思います。それについてはStackoverflowの他の投稿を参照してください。) 長い話を簡単にすると、派生したカラムに一意制約があり、衝突を避けるために増分し続ける数値部分を含んでいます。ループの中で、私は。
- select max(some_value)
- 結果のインクリメント
- この新しい結果で新しいオブジェクトを保存しようとする
- 明示的にエンティティをフラッシュし、ユニークインデックスが原因で失敗した場合、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"
そして、新たなExceptionがキャッチされます。一意制約違反の原因となる最初のフラッシュで
DataAccessException
は、エンティティ・マネージャのバッチをクリアしません。この場合、どのように対処するのが適切でしょうか?私はJPAでSpringを使用しており、エンティティマネージャに直接アクセスすることはできません。必要であればインジェクトすることはできると思いますが、それはこの問題に対する苦痛の解決策です。
解決方法は?
一度何かをフラッシュし、それが失敗して例外がスローされると、トランザクションはロールバックとしてマークされます。つまり、例外をキャッチして処理を続行しても、結局はロールバックされてしまうということです。
実際、どんな例外が投げられたかは全く問題ではありません。Springのトランザクションマネージャはデフォルトで、すべての
チェックされていない
例外が発生します。
この問題を解決するには
noRollbackFor
の上に
@Transactional
アノテーション (アノテーションドライバトランザクションを使用している場合)
編集 - この制約違反の場合、トランザクションはおそらくデータベースレベルでロールバックとしてマークされるため、これも役に立ちません。
関連
-
[解決済み] JVMフラグCMSClassUnloadingEnabledは、実際に何をするのですか?
-
[解決済み] ボタンでTextFieldをクリアする(Java)
-
[解決済み] Java Genericメソッドをstaticにするには?
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違いについて
-
[解決済み] 午前0時からの時間を秒単位で取得する方法
-
[解決済み] JDBC タイプの方言マッピングがありません。1111
-
[解決済み] init-paramとcontext-param
-
[解決済み] ヘッドリカーシオンとテールリカーシオンの違い [重複]について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] この配列の中の数字を入れ替えるには、何が足りないのでしょうか?ジャバ
-
[解決済み] パラメータ[変数]の不正な修飾子;finalのみが許可される[closed]。
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] ORA-01654: インデックスを拡張できません。
-
[解決済み] HTTP ステータス 500 - サーブレットクラス pkg.coreServlet のインスタンス化に失敗しました。
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] publicId と systemId の間に空白が必要です。
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] 文字列の巻き方
-
[解決済み] x--やx++はここで何をするのですか?