Spring事务注解回滚测试似乎不太顺利

Posted

技术标签:

【中文标题】Spring事务注解回滚测试似乎不太顺利【英文标题】:Spring transactional annotation rollback test doesn't seem to go well 【发布时间】:2021-12-29 09:33:21 【问题描述】:

这是控制器代码:

@GetMapping("/test/hello")
    public String test()  
        Member m = memberService.transactionTest();
        return "haha";
    

这是服务代码:

   @Transactional(rollbackFor = NullPointerException.class)
    public Member transactionTest() 
            Member m = Member.builder()
                    .username("rollback")
                    .age(32)
                    .team(teamRepository.findById(1L).get())
                    .coach(coachRepository.findById(1L).get())
                    .build();
            memberRepository.save(m);
            exception();
            return m;
    

    public void exception()
        Member m = null;
        m.getUsername();
    

据我所知,它何时完成应该回滚 因为 RuntimeException 发生但插入过程运行良好所以我想知道为什么。

【问题讨论】:

存储库也是事务性的吗?如果是这样,它是否具有默认传播?顺便说一句,默认行为是回滚任何 RuntimeException,因此无需明确提及 rollbackFor(我不确定这是否会添加到默认行为或覆盖它)。 你正在使用哪个数据库,通过anychange mysql M.Deinum 它连接到 MariaDB sur Thomas 我没有设置任何传播设置,我只在该方法上设置了 Transactional 选项 T.T 【参考方案1】:

因为Optional.get() 抛出NoSuchElementException(而不是空指针)。

From javadoc:

public T get()

如果此Optional 中存在值,则返回该值,否则抛出NoSuchElementException....

通过rollbackFor = NullPointerException.class,您将NoSuchElementException 排除在可回滚异常之外。

【讨论】:

以上是关于Spring事务注解回滚测试似乎不太顺利的主要内容,如果未能解决你的问题,请参考以下文章

Spring基础知识1--环境搭建bean创建依赖注入注解注入

spring 声明式事务管理在真实的Service和单元测试时的回滚情况,需要注意的问题,jpa为例子

Spring @Transactional ——事务回滚

Spring @Transactional ——事务回滚

四Spring事务回滚

Spring JPA Junit 关闭自动回滚