Управление настройками внутренней транзакции из внешней транзакции с помощью Spring 2.5

Я использую управление транзакциями Spring 2.5, и у меня есть следующая настройка:

Боб1

@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
  }
}

Боб2

@Transactional
public void execute() {
  // do something which throws a RuntimeException
}

Сбой никогда не сохраняется в БД из Bean1, потому что вся транзакция откатывается.

Я не хочу добавлять noRollbackFor в Bean2, потому что он используется во многих местах, где нет логики для правильной обработки исключений во время выполнения.

Есть ли способ избежать отката моей транзакции только тогда, когда Bean2.execute() вызывается из Bean1?

В противном случае, я думаю, мой лучший вариант - сохранить мою ошибку в новой транзакции? Что-нибудь еще чистое я могу сделать?


person Damien    schedule 01.10.2010    source источник
comment
Я не понимаю, почему он откатывается. Вы повторно выбрасываете исключение в блоке catch?   -  person skaffman    schedule 02.10.2010
comment
Нет, не знаю. Кажется, он откатывается, потому что Spring TransactionInterceptor помечает транзакцию для отката при выходе из Bean2.   -  person Damien    schedule 02.10.2010
comment
Я решил свою проблему, сохранив ошибку в новой транзакции, используя распространение REQUIRES_NEW. Но мне любопытно узнать, есть ли лучшее решение.   -  person Damien    schedule 07.10.2010


Ответы (1)


Это одно из предостережений аннотаций... ваш класс нельзя использовать повторно!

Если бы вы настроили свои транзакции в XML, это было бы возможно.

Предполагая, что вы используете XML-конфигурацию: если она не потребляет дорогих ресурсов, вы можете создать еще один экземпляр bean2 для использования указанного вами кода. То есть вы можете настроить один из них, как вы указали выше, а другой без отката для исключения.

person Eran Harel    schedule 22.10.2010
comment
Спасибо, это хорошее замечание. В любом случае, вся настройка транзакций в моем приложении была очень плохой, с транзакциями, объявленными на уровне DAO. Из-за этого у меня все еще есть некоторые встроенные транзакции, как показано в вопросе, но я попытаюсь провести рефакторинг, когда у меня будет шанс. - person Damien; 23.10.2010