Исключение также откатывает сохранение журнала интеграции.Если вы хотите сохранить журнал, вы должны указать отдельную транзакцию при сохранении.
Абстрагируйте репозиторий журнала для службы, а в методе службы, который сохраняет журнал, добавьте транзакцию, которая создает новую транзакцию..
@Service
public class IntegrationLogService {
private final IntegrationLogRepository logRepository;
@Autowired
public IntegrationLogService(IntegrationLogRepository logRepository) {
this.logRepository = logRepository;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save(Log log) {
this.logRepository.save(log);
}
}
В вашей компании замените
finally {
integrationLogRepository.save(log);
}
на
finally {
integrationLogService.save(log);
}
Изменить
Зачем устанавливать @Transactional(propagation = Propagation.NOT_SUPPORTED)
на бизнес-уровне работал?
Чтобы понять, почему он работал, нам нужно сначала посмотреть, что происходит, когда весной вызывается save
в хранилище, которое использует org.springframework.data.repository.CrudRepository
.
Spring пытается определить TransactionAttribute
для метода и targetClass.Для метода save
и класса CrudRepository
короче он не нашел ни одного.Spring использует SimpleJpaRepository
в качестве реализации по умолчанию CrudRepository
, если он не нашел никаких транзакционных атрибутов в вашем, он будет использовать тот, который указан в SimpleJpaRepository
.
@Transactional
public <S extends T> S save(S entity)
Требуется распространение по умолчанию на @Transactional
.
Propagation propagation() default Propagation.REQUIRED;
Поддержите текущую транзакцию, создайте новую, если ее не существует.
Как видно из документации выше, если транзакция не указана, она создаст новую.Поэтому, когда вы устанавливаете транзакцию на бизнес-уровне на NOT_SUPPORTED
(Выполнение без транзакций), фактический CrudRepository
действительно создал свою собственную транзакцию, что означает, что откат не повлияет на нее.