我在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中给我一个示例,该示例将不可见。非常感谢您的任何建议。
答案 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();
}