В современном компиляторе, вероятно, не так много. Он может быть встроен без inline
, и не не будет с inline
.
Используйте @Transactional
на уровне Controller
. Чтобы вызвать откат, бросьте RuntimeException
из контроллера.
Примерно так:
public class Controller {
private final MyServiceImpl myService;
@Transactional
@PostMapping("/truc")
public void truc() {
Entity ent = new Entity();
myService.createEntity(ent);
Entity2 ent2 = new Entity2();
myService.createEntity2(ent2);
boolean b = {some conditions};
if(b){
//to do flush
}
else{
//This will trigger rollback
throw new RuntimeException("I want to rollback to cancel what I did in this method");
}
}
}
Вы можете добавить новый метод в MyServiceImpl
, который вызывает оба метода createEntity()
внутри. После этого вся бизнес-логика внутри этого метода будет обрабатываться транзакционно и автоматически откатываться при возникновении RuntimeException (используйте rollBackFor для проверенных исключений), поскольку ваш класс обслуживания помечен как trasactional. Также все открытые методы из MyServiceImpl
становятся транзакционными, если вы добавите аннотацию @Transactional
в ваш класс. Нет необходимости в отдельной аннотации для ваших методов (кроме случаев, когда вы хотите изменить некоторые параметры транзакции, такие как изоляция, распространение и т. Д.)