Spring Transaction - noRollbackFor не будет фиксироваться при возникновении исключения - PullRequest
2 голосов
/ 31 января 2012

Я хочу, чтобы, если я получил исключение по электронной почте, НЕ откатывал транзакцию.

Я использую HibernateTransactionManager и

set  property name="nestedTransactionAllowed" value="true"

, потому что у меня есть вложенные транзакции.

Кроме того, потому что я звоню this.getService(), я установил

lookup-method name="getService" bean="enrollmentProcessorService".

Таким образом, я должен получить Spring Proxy.

Но если возникают исключения, транзакция все еще откатывается.мой код выглядит так:

@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void processConfirmation() throws SystemException {
        //do something
        this.getService().processConfirmationData(as400ContractId);


}
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {MailException.class})
public void processConfirmationData(final long as400ContractDataId) throws SystemException {
    final AS400ContractData as400ContractData = this.readAS400ContractData(as400ContractDataId, false);

    this.populateEnrollmentOptionAnswers(as400ContractData.getContractData());

    final PersonalData personalData = this.readPersonalData(as400ContractData.getContractData()
            .getEpiphanyPersonalData().getPersonalData().getId(), true);

    try {
        personalData.setConfirmMailSent(true);
        as400ContractData.getContractData().getEpiphanyPersonalData().getPersonalData().setConfirmMailSent(true);
        this.personalDataDAO.flush();
        this.emailService.sendConfirmationMailToLOI(as400ContractData); //commit if exception is thrown here
    } catch (final DataAccessException dae) {
        LOGGER.error(CANNOT_UPDATE_PERSONAL_DATA_OBJECT, dae);
        throw new SystemException(StringUtils.EMPTY, CANNOT_UPDATE_PERSONAL_DATA_OBJECT, dae);
    } catch (final MessagingException e) {
        LOGGER.error(CANNOT_SEND_CONFIRMATION_EMAIL, e);
        throw new SystemException(StringUtils.EMPTY, CANNOT_SEND_CONFIRMATION_EMAIL, e);
    } catch (final MailException e) {
        Throwable rootCause = e.getRootCause();
        System.out.println("caught");

Ответы [ 3 ]

2 голосов
/ 31 января 2012

Во-первых, вы перехватываете исключение, поэтому перехватчик Spring не может его увидеть и откатить транзакцию.

И затем, даже если вы его не поймали, вы настроили метод с помощью **no**RollbackFor = {MailException.class}. Это означает, что вы не хотите откат, если выброшено это исключение. Вместо этого используйте rollbackFor = {MailException.class}.

1 голос
/ 31 января 2012

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

Также вам следует перебросить исключение.Не перехватывать MailException.

0 голосов
/ 16 августа 2013

Вчера я столкнулся с той же проблемой.

Когда я увидел источник: org.springframework.transaction.interceptor.TransactionInterceptor # invoke.

Я нашел, где проблема.

this.emailService.sendConfirmationMailToLOI - это другая служба, поэтому атрибут TransactionAttribute является новым.

Вы можете решить эту проблему: @Transactional (распространение = Propagation.REQUIRES_NEW, noRollbackFor = {MailException.class}) В этом методе (emailService.sendConfirmationMailToLOI *), приведенная выше конфигурация

...