今天写代码的时候有一个service需要用到事务,故使用@Transactional注解

@Transactional
Map<String, Object> joinTeam(Long teamId, Long userId) throws Exception;

这里抛出自己定义的异常来实现事务回滚

接口实现类方法如下

 public Map<String, Object> joinTeam(Long teamId, Long userId) throws Exception {Map<String, Object> result = new HashMap<>();Team team = teamService.getTeamById(teamId);//添加组队成员TeamMember member = new TeamMember();member.setUserId(userId);member.setTeamId(teamId);teamMemberDao.saveTeamMember(member);//更新组队人数team.setCurrentSignup(team.getCurrentSignup() + 1);Long count = teamService.updateTeamCurrentSignup(team);int i = 0;while (count == 0) {if (i >= 3) {throw new BaseException(BaseException.OPTIMISTIC_LOCK);}team = teamService.getTeamById(teamId);team.setCurrentSignup(team.getCurrentSignup() + 1);count = teamService.updateTeamCurrentSignup(team);i++;}result.put("success", true);result.put("message", "加入成功!");throw new Exception(BaseException.OPTIMISTIC_LOCK);}

teamMemberDao.saveTeamMember(member) 与 count = teamService.updateTeamCurrentSignup(team) 两个修改库操作,需要 teamService.updateTeamCurrentSignup(team) 抛异常来控制 teamMemberDao.saveTeamMember(member) 的数据回滚

但是结尾抛异常数据并不回滚,很是糟心。

于是查看Spring的Transactional的API文档,发现下面这段:

If no rules are relevant to the exception, it will be treated like DefaultTransactionAttribute (rolling back onruntime exceptions).

所以Transactional默认异常回滚是runtimeexcetion才回滚

excetion是所有异常的总称。
而runtimeexcetion是具体的某一个异常。

所以得将Transactional设置回滚异常为excetion

故将接口修改如下,这次再抛自定义异常就会回滚了

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
Map<String, Object> joinTeam(Long teamId, Long userId) throws Exception;
  • 1 天

记一次 @Transactional不生效的问题相关推荐

  1. @Transactional事务生效条件与样例

    @Transactional事务生效条件 @Transactional注释的方法,不能是private修饰 @Transactional注释的方法,必须是有接口的方法实现(通用的Spring面向接口编 ...

  2. Spring Boot之@Transactional无法生效的问题分析

    引言 在Spring Boot中通过在pom.xml文件中的dependency来引入data-jpa的完整依赖,实现dao层的快速实现. 数据库类型: MySQL 应用框架: Spring Boot ...

  3. spring事务注解@Transactional不生效、不回滚原因

    一般情况下在方法上直接添加@Transactional即可,但是极有可能会达不到我们想要的效果,这时就需要添加相应的参数,参数如下. @Transactional(propagation=Propag ...

  4. 【操作随记】Markdown表格不生效不生效

    在之前写github项目中的README的时候,想要添加表格,根据语法编辑发现表格不生效. 如: # 一.数据库试题 现有学生.课程.成绩.教师四张表.包含以下信息: 1.学生表(STUDENT) | ...

  5. 记一次keep-alive没有生效的排查

    先贴问题代码 <keep-alive :include="[需要缓存的组件name]"><div class="main-content-wrapper ...

  6. java事务不生效场景_springboot中使用@Transactional注解事物不生效的坑

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...

  7. springboot 调用方法事物_springboot中使用@Transactional注解事物不生效的坑

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...

  8. 事物处理@Transactional

    @Transactional 加于private方法, 无效 @Transactional 加于未加入接口的public方法, 再通过普通接口方法调用, 无效 @Transactional 加于接口方 ...

  9. @Transactional注解的失效场景

    @Transactional注解的失效场景 引言 @Transactional 注解相信大家并不陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功.要么同时失败.使用@Tran ...

最新文章

  1. 一年暴涨近20倍,比特币是郁金香泡沫还是庞氏骗局?
  2. TensorFlow练习7: 基于RNN生成古诗词
  3. PHP--认识Smarty模板引擎
  4. TCP/IP模型层次结构
  5. VCG(VisualCodeGrepper)安装使用教程
  6. 思科加强生成树性能的属性(Portfast /Uplinkfast/BackboneFast)与RSTP的关系
  7. centos 安装tomcat_简单介绍Linux配置mysql,tomcat,Nginx 开机自启动的几个方式
  8. 保险条款精解(三) 撞车
  9. 如何在同一地方组建多个 ZigBee 网络
  10. java中a 和 a_Java中a=a++ 和 a=++a(轉)
  11. flutter 防止键盘弹出 导致超出屏幕
  12. MVC 异常处理机制
  13. PRML第三章3.3贝叶斯线性回归
  14. 2021年道路运输企业主要负责人和安全生产管理人员安全考核题型[安考星]
  15. 台式计算机调亮度,台式电脑显示器屏幕亮度怎么调节?
  16. Vulkan_Ray Tracing 08_光照、材质、阴影
  17. ofd转成html,基于HTML5的OFD文件在线显示的方法以及装置与流程
  18. android 层叠view,RecyclerView进阶之层叠列表(上)
  19. CSAPP--BombLab
  20. keil4出现目标未被创建,keil 目标未创建

热门文章

  1. shlwapi常用的操作路径函数
  2. 【Boost】boost库中智能指针——intrusive_ptr
  3. 【Boost】boost库中智能指针概述
  4. Redis 五种数据类型
  5. 服务容错、限流、资源隔离、熔断、监控…3天,撸完了!
  6. Software Ate The World, Open Source Is Eating The Software World
  7. AAC音频基础知识及码流解析
  8. 学习方法之06为什么你的计划总是完不成
  9. Spark之Spark角色介绍及运行模式
  10. 从入门到掉坑:Go 内存池/对象池技术介绍