Распространение транзакций. REQUIRES_NEW не работает - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь сохранить список сущностей в Oracle Db.

@Transactional
public void save() {
//logick
for (QuittanceType quittanceType : quittance) {
       quittancesService.parseQuittance(quittanceType);
     }
//logick
  }

На каждом шаге я вызываю этот метод:

@Transactional
@Override
public void parseQuittance(QuittanceType quittance) {
    try {

        //logick create payToChargeDb
        paymentToChargeService.saveAndFlush(payToChargeDb);

    } catch (Exception e) {
        log.warn("Ignore.", e);
    }
}

и метод

        @Override
        public PaymentsToCharge saveAndFlushIn(PaymentsToCharge paymentsToCharge) {
            return paymentToChargeRepository.saveAndFlush(paymentsToCharge);
        }

Когда я пытаюсь сохранить сущность с ограничением Мой откат основной транзакции и Iget stacktrace:

Caused by: java.sql.BatchUpdateException: ORA-02290: CHECK integrity constraint violated(MYDB.PAYMENTS_TO_CHARGE_CHK1)

Но я хочу пропустить не успешные объекты и сохранить успех.Я помечаю свой метод

@Transactional(propagation = Propagation.REQUIRES_NEW)

, и он выглядит так:

@Transactional
@Override
public void parseQuittance(QuittanceType quittance) {
    try {

        //logick create payToChargeDb
        paymentToChargeService.saveAndFlushInNewTransaction(payToChargeDb);

    } catch (Exception e) {
        log.warn("Ignore.", e);
    }
}

и

@Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public PaymentsToCharge saveAndFlushInNewTransaction(PaymentsToCharge paymentsToCharge) {
        return paymentToChargeRepository.saveAndFlush(paymentsToCharge);
    }

Но когда я пытаюсь сохранить сущность с ограничением, я не получаю исключенияи не входить в блок catcj.просто перестаньте работать отладка и приложение продолжит работать.Я не получаю никаких ошибок.и как будто происходит откат

1 Ответ

0 голосов
/ 23 ноября 2018

Прокси, созданный с помощью @Transactional, не перехватывает вызовы внутри объекта.

В режиме прокси (который используется по умолчанию) перехватываются только внешние вызовы методов, поступающие через прокси.Это означает, что самовывоз (по сути, метод в целевом объекте, вызывающий другой метод целевого объекта) не приводит к фактической транзакции во время выполнения, даже если вызванный метод помечен @Transactional.Кроме того, прокси-сервер должен быть полностью инициализирован, чтобы обеспечить ожидаемое поведение, поэтому вам не следует полагаться на эту функцию в коде инициализации (то есть @PostConstruct).

https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#transaction-declarative

В той же документации r рекомендуется использовать AspectJ, если вам нужно такое поведение .

...