专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  能在一家不到 20 人的 IT ... ·  20 小时前  
芋道源码  ·  分享一次 ShardingJDBC ... ·  20 小时前  
芋道源码  ·  告警:MyBatis-Plus中慎用@Tra ... ·  20 小时前  
Java编程精选  ·  CEO裁员后不理解:原来100个人干50个人 ... ·  昨天  
51好读  ›  专栏  ›  芋道源码

告警:MyBatis-Plus中慎用@Transactional注解,坑的差点被开了...

芋道源码  · 公众号  · Java  · 2025-06-10 09:30

正文

请到「今天看啥」查看全文


  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
  • 【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本

    来源:yes的练级攻略


    昨天测试说有个 xx 功能用不了,扔给我一个截图,说有报错:

    报错信息就是: Transaction rolled back because it has been marked as rollback-only ,很好理解:事务被回滚了,因为它已经被标记了只能回滚。

    我一看巧了,这不就是我之前分析过的面试题吗!

    之前的文章我解释过:这种错一般发生在嵌套事务中,即内层事务出错,但是由于是否提交事务的操作由外层事务触发,于是乎内层事务只能做个标记,来设置当前事务只能回滚。

    紧接着它想抛出错误,但是由于被 try catch 了,于是乎正常执行后续的逻辑,等执行到最后,外层要提交事务了,发现当前事务已经被打了回滚的标记,所以提交失败,报了上面的错。

    问题重现

    具体原理可以看我之前的那篇文章,这里简单举例下会出错的示例代码:

    大致就是下面这个代码调用逻辑,有一个 service 标记了 @Transcational,采用默认的事务传播机制:

    紧接着 UserService#insert 调用了 addressService#errorInvoker,这个方法也标记了 @Transcational:







    请到「今天看啥」查看全文