Скажите, у меня есть следующие весенние бобы в приложении весенней загрузки. Мое намерение состоит в том, чтобы сделать foo()
транзакционным так:
- Когда
barService.bar()
генерирует исключения, персистент получает откат.
- Когда персистент вызывает исключение, исключение распространяется до вызывающей стороны «немедленно», поэтому
barService.bar()
НЕ вызывается .
@Service
public class FooService
{
@Autowired
private FooRepository fooRepository;
@Autowired
private BarService barService;
@Transactional
public void createFoo(Foo foo) {
fooRepository.save(foo);
// expect to not execute when the above line throws exceptions
barService.bar();
}
}
@Service
public class BarService {
public void bar() {
}
}
Пока что первое требование работает, а второе - нет. Когда персист бросает исключение, barService.bar()
ВСЕГДА называется .
Если я удаляю @Transactional
, 2-е требование работает, 1-е не работает.
Я также попробовал все Propagation
типы, ни один из них не работает так, как я ожидал. Например, если я использую @Transactional(MANDATORY)
, я получаю следующую ошибку:
org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'