Как откатить транзакцию при вызове метода @Transactional и нетранзакционного в одном и том же Сервисе? - PullRequest
0 голосов
/ 28 сентября 2018

Я использую данные Spring и Spring JPA.У меня есть один метод, который обновляет одну таблицу базы данных.

@Autowired InvoiceClient;

@Override
@Transactional
public String doBilling(String x){
//get date from TableOne
Bill bill = billsRepository.getBill(x);
if(bill.isPaid()){
    generateInvoice();
}
bill.setPaymentDate(new Date());
return "SUCCESS";
}

generateInvoice - это не транзакционный метод, который вызывает метод @Transactional из другого сервиса.

public void generateInvoice(){
    invoiceClient.generateInvoice();//this is @Transactional, make changes in TableTwo
}

В случае любого исключения в generateInvoiceМетод всей транзакции откатывается.Теперь я хочу добавить еще один метод, который будет иметь список номеров счетов.Я вызываю метод doBilling в цикле, чтобы выполнить выставление счетов для всех счетов.

@Override
@Transactional(readOnly = false, rollbackFor = {Throwable.class}, propagation = Propagation.REQUIRED)
public String doBillingForAll(List<String> tx){
    for(String x: tx){
         doBilling(x);
    }
}

Но теперь, в случае каких-либо исключений в методе doBilling, все методы setPayment откатываются, но generateInvoice сохраняется.Я хочу откат генерировать счет-фактуру также.Как я могу это сделать?

1 Ответ

0 голосов
/ 28 сентября 2018

Вам не нужно определять rollbackFor = {Throwable.class}.По умолчанию все RuntimeException выполняют откат при использовании @Transactional.

. Может случиться так, что из-за того, что вы используете и промежуточный не @Transactional аннотированный метод, основная транзакция приостанавливается и создается вложенная.

Попробуйте ввести @Transactional в public void generateInvoice(), затем следует применить Propagation.REQUIRED с откатом ваших счетов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...