我会尽力描述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
?