@事务和可序列化级别问题

时间:2018-10-10 09:35:51

标签: jpa isolation-level

我在JPA中的隔离级别有问题。例如,我有以下代码:

@Transactional(isolation = Isolation.SERIALIZABLE)
public void first() {
    Obj obj = new Obj();
    obj.setName("t");
    objDAO.save(obj);
    second();
}

@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void second(){
    List<Obj> objs = objDAO.findAll();
}

在我看来,第二种方法不应看到与第一种方法相比未完成的更改。因此,名称为“ t”的新对象在提交之前不可见(但它是)。 如果我错了,那么请在JPA中给我一个示例,该示例将不可见。非常感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

如果您的方法在一个类中,则它将无法工作,因为容器会将其视为单个事务。容器不知道您要创建新交易。

从Spring参考文献:

  

注意:在代理模式下(默认),将仅拦截通过代理进入的“外部”方法调用。这意味着“自调用”,即目标对象中的一种调用目标对象其他方法的方法,即使被调用的方法标有@Transactional,也不会在运行时导致实际事务!

如果要在新事务中调用方法second(),可以尝试以下方法:

@Autowired
private ApplicationContext applicationContext;

@Transactional(isolation = Isolation.SERIALIZABLE)
public void first() {
    Obj obj = new Obj();
    obj.setName("t");
    objDAO.save(obj);
    applicationContext.getBean(getClass()).second();
}

@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void second(){
    List<Obj> objs = objDAO.findAll();
}
相关问题