2010-10-01 8 views
4

Я использую 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?

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

+0

Я не вижу, почему он откатывается назад. Вы повторно бросаете исключение в блок catch? – skaffman

+0

Нет, не знаю. Кажется, он откатывается, потому что Spring TransactionInterceptor отмечает транзакцию для отката при выходе из Bean2. – Damien

+0

Я решил свою проблему, сохранив отказ в новой транзакции, используя распространение REQUIRES_NEW. Но мне любопытно узнать, было ли лучшее решение. – Damien

ответ

1

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

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

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

+0

Спасибо, это хорошее замечание. Во всяком случае, вся настройка транзакций в моем приложении была очень плохой, с транзакциями, объявленными на уровне DAO. Из-за этого у меня все еще есть встроенные транзакции, как показано в вопросе, но я постараюсь реорганизовать, когда у меня появится шанс. – Damien

 Смежные вопросы

  • Нет связанных вопросов^_^