これはこの質問に関連していますが、パスカルが彼の答えで指摘している問題を非常に具体的に語っています。
エンティティが存在しない場合(主キーがデータベースにない場合)は永続化する必要があります。そうでない場合は、新しいエンティティの生成を再試行して永続化する必要があります。
基本的に、使用済みのレコードテーブルがあり、乱数を生成していますが、複製を作成することはできません(また、UUIDなどを使用することもできません)。そのため、番号を主キーとして、使用済みのものをテーブルで追跡します。
JPAを使用して、競合状態を回避し、存在する場合にのみ作成するようにするにはどうすればよいですか?スレッド1が存在する場合はクエリを実行し、次に2つのクエリをスレッド化し、次に1つの挿入をスレッド化し、次に2つの挿入をスレッド化するというケースを回避する必要があります。
明らかなオプションは、例外をキャッチしようとすることです。問題は、トランザクションがEntityExistsExceptionでロールバックされることですが、トランザクションをロールバックするのではなく、次の乱数をバックして保持したいと思います。
醜い解決策は、別のトランザクションで新しいエンティティの永続性を呼び出すことであるようです(したがって、ロールバックさせます)。ここにもっと良い習慣はありますか?
また、根本的な問題が他の問題である場合にプロセスが再試行を続けないように、原因が重複であることを明確に知っておくと便利です。