让我们说我的@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
}
答案 0 :(得分:1)
是的,deleteOldSteps
()中的代码将加入当前事务(由saveListOfValidationSteps
开始)。
如果您使用的是LocalContainerEntityManagerFactory
,那么spring将自行管理事务并将entityManager
实例附加到ThreadLocal
,因此在执行deleteOldSteps
()内的代码时,spring会首先检查EntityManager
是否存在于ThreadLocal
处,如果已经存在则重用(以便加入现有的持久性上下文)。
因此,从外部调用saveListOfValidationSteps
()时,spring将启动新事务,而从本地调用deleteOldSteps
时,它将加入现有事务(由于ThrealLocal
数据)
注意:但是,如果未为deleteOldSteps
注释@Transactional
,并且deleteOldSteps
将不会启动新事务,因为不会捕获本地呼叫到春季为止。
答案 1 :(得分:0)
是的
@Transactional
之下添加了一个特殊的“环绕”拦截器,该拦截器在进入方法之前初始化事务,并在方法完成时提交/回滚。
只要该方法在同一线程中调用其他方法,它们都将成为事务的一部分。