我有以下代码
@服务 公共类EmployeeService { EmployeeService employeeService; //测试不同的行为
@PersistenceContext
EntityManager entityManager;
@Transactional(propagation = Propagation.REQUIRED)
public void requiredPropagationMethod(){
System.out.println("EmployeeService.requiredPropagationMethod");
Employee e = new Employee();
e.setEmpName("required propagation method employee");
entityManager.persist(e);
employeeService.requiresNewPropagationMethod(); //creates a new transaction and suspends old one
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void requiresNewPropagationMethod(){
System.out.println("EmployeeService.requiresNewPropagationMethod");
Employee e = new Employee();
e.setEmpName("requires new propagation method employee");
entityManager.persist(e);
throw new RuntimeException("Roll back requires new method");
}
}
执行此代码后,我希望员工的名字是#34;所需的传播方法员工"在Employee表中,但它不存在意味着事务都被回滚。但预期的行为是shuldn&t。我需要知道为什么会这样?
答案 0 :(得分:1)
实际上,当从方法到另一个方法的调用时,第二个不被代理拦截。在这个例子中,您通过传递Propagation.REQUIRES_NEW,因为您是从另一个方法调用它。第二个无法启动新交易。它使用的是第一种方法使用的相同事务。因此,当发生异常时,第一个事务就会回滚。