Propagation_requires_new回滚暂停的事务

时间:2015-10-16 05:49:10

标签: spring transactions propagation

我有以下代码

@服务 公共类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。我需要知道为什么会这样?

1 个答案:

答案 0 :(得分:1)

实际上,当从方法到另一个方法的调用时,第二个不被代理拦截。在这个例子中,您通过传递Propagation.REQUIRES_NEW,因为您是从另一个方法调用它。第二个无法启动新交易。它使用的是第一种方法使用的相同事务。因此,当发生异常时,第一个事务就会回滚。