Избегайте вложенных транзакций - PullRequest
0 голосов
/ 26 апреля 2018

Ниже приведена структура моего метода:

    @Override
    @Transactional
    public methodOuter(){
      //some processing
      methodInner1();
      methodInner2();
    }

    @Override
    @Transactional
    public methodInner1(){
    //save something to db
    }

    @Override
    @Transactional
    public methodInner2(){
    //some processing
    //throws exception
    }

Сценарий: methodInner1() успешно обработан, но methodInner2() выдает исключение. Поэтому я хочу откат коммита, сделанного в methodInner1(). В настоящее время коммит в methodInner1() не откатывается. Я хочу methodOuter() быть в одной транзакции

1 Ответ

0 голосов
/ 26 апреля 2018

Если вы знаете тип сгенерированного исключения (допустим, это NPE), вы можете попробовать что-то вроде

@Override
@Transactional(rollbackOn=NullPointerException.class)
public methodOuter(){
  //some processing
  methodInner1();
  methodInner2();
}

@Override
public methodInner1(){
  //save something to db
}

@Override
public methodInner2(){
  //some processing
  //throws exception
}

В этом случае вам не нужно аннотировать «внутренние» функции. methodOuter будет откатываться, если выбрасывается исключение NullPointerException. Если вы хотите выполнить откат для каждого возможного исключения, вы должны изменить аннотацию на

@Transactional(rollbackOn=Exception.class)

Кстати: RuntimeExceptions вызовет откат независимо от того, аннотированы они или нет.

...