Как откатить программно после корректной работы функций @Transactionnal? - PullRequest
0 голосов
/ 17 января 2019

Я попытался сделать откат после того, как некоторые функции с @Transational работали

Откат работает, когда они являются ошибками из-за sql, и это фиксирует.

Контроллер

@RestController
@RequestMapping()
@Slf4j
@AllArgsConstructor
public class Controller {
    private final MyServiceImpl myService;
    @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{
            //to do rollback to get initial state before createEntity()
        }
    }
}

MyServiceImpl

@Transactional
@Slf4j
@AllArgsConstructor
public class SiteServiceImpl {
    //Repositories associed with entities extends JpaRepository
    private RepoEntity repoEntity;
    private RepoEntity2 repoEntity2;

    @Transactional
protected void createEntity(Entity ent){
        this.repoEntity.save(ent);
    }
    @Transactional
protected void createEntity2(Entity2 ent){
        this.repoEntity2.save(ent);
    }
}

Я мог бы откатить и отменить две сохраненные сущности программно. Я не специалист по Spring и не знаю, как это сделать. Может быть с конфигурацией?

Спасибо за вашу помощь.

Ответы [ 2 ]

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

Вы можете добавить новый метод к вашему MyServiceImpl, который вызовет оба createEntity() метода внутри. После этого вся бизнес-логика внутри этого метода будет обрабатываться транзакционно и автоматически откатываться при возникновении RuntimeException (используйте rollBackFor для проверенных исключений), поскольку ваш класс обслуживания помечен как trasactional. Также все открытые методы из MyServiceImpl становятся транзакционными, если вы добавите аннотацию @Transactional в ваш класс. Нет необходимости в отдельной аннотации для ваших методов (кроме случаев, когда вы хотите изменить некоторые параметры транзакции, такие как изоляция, распространение и т. Д.)

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

Используйте @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");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...