记一次 @Transactional不生效的问题
今天写代码的时候有一个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不生效的问题相关推荐
- @Transactional事务生效条件与样例
@Transactional事务生效条件 @Transactional注释的方法,不能是private修饰 @Transactional注释的方法,必须是有接口的方法实现(通用的Spring面向接口编 ...
- Spring Boot之@Transactional无法生效的问题分析
引言 在Spring Boot中通过在pom.xml文件中的dependency来引入data-jpa的完整依赖,实现dao层的快速实现. 数据库类型: MySQL 应用框架: Spring Boot ...
- spring事务注解@Transactional不生效、不回滚原因
一般情况下在方法上直接添加@Transactional即可,但是极有可能会达不到我们想要的效果,这时就需要添加相应的参数,参数如下. @Transactional(propagation=Propag ...
- 【操作随记】Markdown表格不生效不生效
在之前写github项目中的README的时候,想要添加表格,根据语法编辑发现表格不生效. 如: # 一.数据库试题 现有学生.课程.成绩.教师四张表.包含以下信息: 1.学生表(STUDENT) | ...
- 记一次keep-alive没有生效的排查
先贴问题代码 <keep-alive :include="[需要缓存的组件name]"><div class="main-content-wrapper ...
- java事务不生效场景_springboot中使用@Transactional注解事物不生效的坑
一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...
- springboot 调用方法事物_springboot中使用@Transactional注解事物不生效的坑
一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...
- 事物处理@Transactional
@Transactional 加于private方法, 无效 @Transactional 加于未加入接口的public方法, 再通过普通接口方法调用, 无效 @Transactional 加于接口方 ...
- @Transactional注解的失效场景
@Transactional注解的失效场景 引言 @Transactional 注解相信大家并不陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功.要么同时失败.使用@Tran ...
最新文章
- 一年暴涨近20倍,比特币是郁金香泡沫还是庞氏骗局?
- TensorFlow练习7: 基于RNN生成古诗词
- PHP--认识Smarty模板引擎
- TCP/IP模型层次结构
- VCG(VisualCodeGrepper)安装使用教程
- 思科加强生成树性能的属性(Portfast /Uplinkfast/BackboneFast)与RSTP的关系
- centos 安装tomcat_简单介绍Linux配置mysql,tomcat,Nginx 开机自启动的几个方式
- 保险条款精解(三) 撞车
- 如何在同一地方组建多个 ZigBee 网络
- java中a 和 a_Java中a=a++ 和 a=++a(轉)
- flutter 防止键盘弹出 导致超出屏幕
- MVC 异常处理机制
- PRML第三章3.3贝叶斯线性回归
- 2021年道路运输企业主要负责人和安全生产管理人员安全考核题型[安考星]
- 台式计算机调亮度,台式电脑显示器屏幕亮度怎么调节?
- Vulkan_Ray Tracing 08_光照、材质、阴影
- ofd转成html,基于HTML5的OFD文件在线显示的方法以及装置与流程
- android 层叠view,RecyclerView进阶之层叠列表(上)
- CSAPP--BombLab
- keil4出现目标未被创建,keil 目标未创建