JPAトランザクション分離レベルでの私の問題について説明しようとします。表1にFK トランザクション分離レベル
JPA(分離レベル:: read_commited
)と> -
Table1
- > PKと日付( 'DDMMYYYY')として定義Table2
:データベース構造 - コード:
Query query = em.createQuery("from Table1 trd where trd.id = :d"); query.setParameter("d", date); Table1 t = null; try{ t = (Table1) query.getSingleResult(); }catch(javax.persistence.NoResultException e){ t = null; } if(t==null){ t=new Table1 (date); em.persist(trd); } for(Table2 q:tables2){ q.setTable1(t); em.merge(q); }
したがって、レコードがdbに存在するかどうかをチェックし、レコードが存在しない場合は新しいレコードを作成します。システムがただ1つのスレッドに基づいている場合、メソッドは完全にcorectです。
- スレッド1:それ以外の場合、このような可能な状況があるエンティティは、日付がデータベースに存在することで表現するかどうかをチェックし
- スレッド2:DOがまったく同じ
それらの両方は、このような記録があると思いまだ存在しないので、新しいものを追加してください。取引をコミットする瞬間まではすべてが大丈夫です。最初のものは例外なくコミットされ、プライマリキーの重複に関連する2番目の1つの例外例外を購入します。
隔離レベルを
SERIALIZABLE
に変更する以外は、このような状況を維持する可能性はありますか?