Я использую 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"
Есть идеи, что я делаю не так?