Сконфигурируйте внутренний транзакционный метод как Propagation.REQUIRES_NEW
, чтобы он всегда фиксировал (т.е. сохранял данные), когда метод завершает работу, независимо от того, выполняется откат внешнего транзакционного метода или нет.
Кроме того, убедитесь, что внешний метод выполняетне собственный вызов внутреннего метода, так как @Transactional
в этом случае не работает (см. раздел Видимость метода и раздел @Transactional в документах ).
Они должны находиться в разных bean-компонентах, которые внешний методвызывает bean-компонент внутреннего метода:
@Service
public class Service1 {
@Autowired
private Service2 service2;
@Transactional(rollbackFor=Exception.class)
public void test1(Account account) throws Exception {
DOA.save(account);
status = service2.test2(account);
if(status!='SUCCESS'){
throw new Exception("Api call failed");
}
}
}
@Service
public class Service2{
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void test2(Account account) {
response // API Call
DOA.save(response);
return response.status;
}
}