Я использую Spring 2.5 управления транзакциями и у меня есть следующие настройки:Управление внутренних параметров транзакций из внешней транзакции с Spring 2,5
Bean1
@Transactional(noRollbackFor = { Exception.class })
public void execute() {
try {
bean2.execute();
} catch (Exception e) {
// persist failure in database (so the transaction shouldn't fail)
// the exception is not re-thrown
}
}
Bean2
@Transactional
public void execute() {
// do something which throws a RuntimeException
}
Сбой никогда не сохраняется в БД из Bean1, поскольку весь транзакция откат.
Я не хочу добавлять noRollbackFor в Bean2, потому что он используется во многих местах, у которых нет логики для правильной обработки исключений во время выполнения.
Есть ли способ избежать отката моей транзакции только тогда, когда Bean2.execute() вызывается из Bean1?
В противном случае, я думаю, мой лучший вариант - сохранить мой отказ в рамках новой транзакции? Что-нибудь еще, что я могу сделать?
Я не вижу, почему он откатывается назад. Вы повторно бросаете исключение в блок catch? – skaffman
Нет, не знаю. Кажется, он откатывается, потому что Spring TransactionInterceptor отмечает транзакцию для отката при выходе из Bean2. – Damien
Я решил свою проблему, сохранив отказ в новой транзакции, используя распространение REQUIRES_NEW. Но мне любопытно узнать, было ли лучшее решение. – Damien