Проблема в том, что транзакция помечается как откат только при возникновении исключения.
Вызов другого метода сама находится в блоке try-catch, но я думаю, что транзакция помечается, когда другой метод возвращается, выдавая исключение.
Пример:
MyService.java
Код: Выделить всё
@Service
public class MyService {
@Autowired
private MyUtils utils;
@Autowired
private MyCrudRepository repository;
@Transactional
public void publicMethod() {
try {
utils.otherPublicMethod();
} catch (Exception ex) {
ex.printStackTrace();
}
// RollbackException: Transaction marked as rollbackOnly
// Even though I caught the exception from the method call itself
repository.save(new MyEntity());
}
}
Код: Выделить всё
@Component
public class MyUtils {
// Does not use transactions, repositories
// But I think it inherits the transaction and marks it as rollbackOnly
public void otherPublicMethod() {
// Maybe this is seen as an uncaught exception
throw new RuntimeException();
}
}
Я не думаю, что это дубликат Does Указание @TransactionalrollbackFor также включает RuntimeException, поскольку исключение в конечном итоге перехватывается.
Проблема может быть аналогичной, поскольку она также включает в себя транзакции и откаты.
Подробнее здесь: https://stackoverflow.com/questions/514 ... eexception