Управление множественными транзакциями в Spring JPA - PullRequest
0 голосов
/ 14 мая 2018

Я использую Spring 4, JPA и Hibernate 5. У меня есть сервис следующим образом:

@Transactional(rollbackFor = Exception.class)
public methodA() {
  // do some stuff
  methodB();
}

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public methodB() {
  try {
    methodC();
  } catch (Exception e) {
    // only log
  }
}


@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public methodC() {
  // do some stuff
}

Чего я хочу добиться, так это: когда вызывается methodA, все, что выполняется до вызова methodB, должно сохраняться независимо от того, что произойдет после. По этой причине я добавил methodB, единственная цель которого - создать новую транзакцию, поэтому, если транзакция с methodC откатами, исходная транзакция methodA также не откатывается. Итак, чтобы подвести итог, я хочу, чтобы первая транзакция была зафиксирована, а вторая - откатана в случае сбоя. Обратите внимание, что methodC не может быть изменен никаким образом.

Этот код, однако, не работает, и я все еще получаю исключение: "TransactionException: Transaction was marked for rollback only; cannot commit"

Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 14 мая 2018

Я использую Spring 4, JPA и Hibernate 5. У меня есть сервис:

Итак, вы используете три метода внутри тот же сервис

Это выделение важно из-за того, как работает пружинный AOP.

Если вы вызываете метод в том же классе, то другие методы не проксируются @Transaction, поэтому они все еще используютта же транзакция methodA.Поэтому вы увидите исключение, когда транзакция будет помечена как rollbackOnly с помощью methodB

. Чтобы решить эту проблему: вам нужно переместить метод methodB в другой сервис, чтобы Spring мог использовать прокси.

...