如何在函数正常工作后以编程方式回滚@Transactionnal



我试图在具有@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的专家,我不知道该怎么做。可能与配置有关?

感谢您的帮助。

Controller级别使用@Transactional。要触发回滚,请从控制器抛出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。此外,如果您在类上添加@Transactional注释,则 MyServiceImpl 中的所有公共方法都将变为事务性方法。不需要对方法进行单独的注释(除非您想要更改某些事务参数,如隔离、传播等)

相关内容

  • 没有找到相关文章

最新更新