Транзакция не откатывается, когда исключение вызывает дочерний метод - Spring - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть метод Service method - SampleServiceImpl ().Я объявил метод Service следующим образом:

@Transactional
@Override
public sampleDTO SampleServiceImpl(SampleDTO sampleDTO) throws SampleException, ParseException { 
   // Method call to methodA.
   createDataA(sampleDTO);
   // Method call to methodB.
   createDataB(sampleDTO);

   return sampleDTO ;
}

Здесь создается DataA, и он не выдает никаких исключений.Но в DataB мы пытаемся создать DataB на основе DataA.Из-за некоторой логики мы не можем создать DataB.Таким образом, мы генерируем исключение образца, например:

count = checkIfDataBExisting(sampleDTO);
if(count == 1){
   throw new SampleException(ErrorConstants.DATA_B_EXISTING);
}

Но проблема в том, что транзакция, которая была зафиксирована во время createDataA (sampleDTO) вызова метода, не откатывается назад.

Почему это на самом деле не работает?Я немного запутался с этим поведением.

РЕДАКТИРОВАНИЕ: 1

метод createData1 (sampleDTO) -

private ADTO createDataA(SampleDTO sampleDTO) throws SampleException{
    ADTO aDTO = null;    
    try {
        //CREATE NEW WORK DRIVER
        aDTO = createNewDataA(sampleDTO);

        //Other arbitary database transactions occurs after creation of AData.


} catch (SampleException exc) {
    SampleException newException = new SampleException (exc.getExceptionObject().getExceptionCode(), exc);

    throw newException ;
}
return aDTO;
}

РЕДАКТИРОВАНИЕ 2:

Декларация SampleException -

public class SampleException extends Exception{
    //Definitions and Declarations.
}

1 Ответ

0 голосов
/ 08 апреля 2019

По умолчанию откат декларативных транзакций только для исключений времени выполнения. SampleException должно быть RuntimeException для транзакции для отката.

Ваш метод подписи:

public sampleDTO SampleServiceImpl(SampleDTO sampleDTO) throws SampleException, ParseException

заставляет меня думать, что SampleException является проверенным.

См. документацию для @Transactional:

Если ни одно из правил не имеет отношения к исключению, оно будет обрабатываться как DefaultTransactionAttribute (откат на RuntimeException и Error, но не на проверенные исключения).

Вы можете сделать SampleException extends RuntimeException или установить атрибут rollbackFor в @Transactional.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...