我會盡力描述JPA的事務隔離級別我的問題。事務隔離級別
數據庫結構:
Table1
- >與PK定義爲日期( 'DDMMYYYY')Table2
- >與FK到Table 1
JPA(隔離級別:: read_commited
) - code:
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);
}
So procedu重新檢查記錄是否存在於數據庫中,如果沒有創建新記錄。如果系統基於一個線程,方法是完全相同的。否則,有可能發生的情況是這樣的:
- 主題1:檢查實體代表按日期數據庫中存在
- 線程2:做同樣的
他們都認爲這樣的記錄有不存在,所以添加一個新的。一切正常,直到提交交易的時刻。沒有任何異常第一個將被COMMITED,購買與主鍵複製相關的第二個上升例外。
是任何可能保留這樣的情況下,只是將隔離級別設置爲SERIALIZABLE
?