春季启动:如果服务中的方法是@Transactional,并且该方法调用其他方法,它们是否也是事务性的?

时间:2019-10-07 10:36:56

标签: hibernate spring-boot spring-data-jpa

让我们说我的@Service中有此方法,即Transactional。如果我在该方法中调用另一个方法,那么另一个方法中的数据库操作是否也作为同一事务的一部分进行事务处理?

@Transactional
public ResponseEntity<List<String>> saveListOfValidationSteps(List<ValidationStep> steps, String controlId, String aNumber){

 deleteOldSteps();
 //calls to repo to add new columns

}

private void deleteOldSteps(){
/calls to repo to delete old columns
}

2 个答案:

答案 0 :(得分:1)

是的,deleteOldSteps()中的代码将加入当前事务(由saveListOfValidationSteps开始)。 如果您使用的是LocalContainerEntityManagerFactory,那么spring将自行管理事务并将entityManager实例附加到ThreadLocal,因此在执行deleteOldSteps()内的代码时,spring会首先检查EntityManager是否存在于ThreadLocal处,如果已经存在则重用(以便加入现有的持久性上下文)。

因此,从外部调用saveListOfValidationSteps()时,spring将启动新事务,而从本地调用deleteOldSteps时,它将加入现有事务(由于ThrealLocal数据)

注意:但是,如果未为deleteOldSteps注释@Transactional,并且deleteOldSteps将不会启动新事务,因为不会捕获本地呼叫到春季为止。

答案 1 :(得分:0)

是的

@Transactional之下添加了一个特殊的“环绕”拦截器,该拦截器在进入方法之前初始化事务,并在方法完成时提交/回滚。

只要该方法在同一线程中调用其他方法,它们都将成为事务的一部分。