Spring-tx: откат только в том случае, если исключение не обнаружено внешним методом - PullRequest
0 голосов
/ 23 января 2019

По умолчанию Spring Framework может выполнить откат, если исключение исключено через границу транзакционного метода.Но в случае распространения транзакции, я хочу откатить транзакцию только в том случае, если исключение не обработано внешним методом (где запускается передача).Можно ли настроить Spring таким образом?

@Transactional
public class OutterA {
    @Autowired
    private Inner inner;

    public void operationA1() {
        this.doSomething();
        inner.doSomething();
    }

    public void operationA2() {
        this.doSomething();
        try {
            inner.doSomething();
        } catch (Exception e) {
            inner.tryAnother();
        }
    }

    public void doSomething() {

    }
}

@Transactional
public class Inner {
    public void doSomething() {
        throw new RuntimeException();
    }

    public void tryAnother() {

    }
}

В приведенном выше коде я ожидаю, что операция A1 будет откатана, потому что исключение не перехватывается и вызывает завершение транзакции, в то время как операция A 2 завершается успешно, потому что это исключениепойман и правильно обработан до завершения транзакции.Но Spring откатит оба.

// Non-transactional
public class OutterB {
    @Autowired
    private Inner inner;

    public void operationB() {
        try {
            inner.doSomething();
        } catch (Exception ignore) {
        }
    }
}

В приведенном выше коде я ожидаю, что операция B всегда будет откатываться, потому что транзакция запускается Inner и исключение выбрасывается через границу транзакции.

1 Ответ

0 голосов
/ 23 января 2019

Я думаю, что вы можете играть с @Transactionl параметрами аннотаций, такими как:

  • rollbackFor, rollbackForClassName
  • noRollbackFor, noRollbackForClassName

В вашем фрагменте кодаВ случае, если вы положите @Transactional(noRollbackFor = RuntimeException.class) на InnerClass, ваша транзакция не будет отменена.Однако размещение аннотации @Transactional на уровне класса повлияет на все открытые методы в этом классе, поэтому я рекомендую размещать эту аннотацию отдельно для каждого метода и определять специфическое поведение с помощью этих параметров.

...