Spring事务回滚失败
下面是一个回滚事务的案例
需求是:转账失败后 转账的事务会回滚,日志事务不会回滚
出现的问题是:
日志事务开启了@Transactional(propagation = Propagation.REQUIRES_NEW)
转账事务开启了@Transactional(rollbackFor = {IOException.class})
转账事务中间使用Try catch finally 使出现异常,日志事务能照常运行
失败情况是:账单有一个执行了,事务未回滚,日志正常记录转账失败信息
失败的原因是:事务管理的机制是AOP监听,当事件出现非runtime异常时候,AOP反射动态代理就无法运行,无法进行事务回滚(详细的我也说不清楚),说明下, 只有runtime 异常和 error异常,才会被捕获回滚
解决办法有2种:
不使用catch捕获, 使用throws在方法声明出抛出异常, 值得注意的是,try finally可以正常使用
这种办法有点投机的嫌疑,方法是使用try catch, 然后在catch中制造有个runtime类的异常,触发回滚机制。
下面附上转账的AccountService代码
@Service@Transactional(rollbackFor = {IOException.class})public class AccountService {@Autowiredprivate AccountMapper am;@Autowiredprivate LogService logService;public void updateAccount(String out, String in, double money) throws IOException {String status = null;try {Integer sta1 = am.updateMoneyByName(out, -money);//int a =1/0;if (true) throw new IOException();Integer sta2 = am.updateMoneyByName(in, money);status = "成功";} finally {if (!"成功".equals(status))status="失败";logService.addLog(out, in, money, status);}}}
日志代码
@Componentpublic class LogService {@Autowiredprivate LogDao logDao;@Transactional(propagation = Propagation.REQUIRES_NEW)public void addLog(String out, String in ,double money,String status){String info = ("发起人:"+out +",接收人:"+ in +",转账金额:"+ money +"元,转账状态:"+status );System.out.println(info);logDao.logAdd(info);}
下面是异常体系结构图:
Spring事务回滚失败相关推荐
- java 事务回滚注解_Java Spring 事务回滚详解
这篇文章主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下 spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代 ...
- spring事务回滚理解
1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了. 声明式事务:就是使用SpringAop配置事务, ...
- Spring事务回滚和异常类
转载自 https://www.cnblogs.com/tianyuchen/p/6678084.html 1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和E ...
- 通过手动抛自定义异常实现spring事务回滚
通过手动抛自定义异常实现spring事务回滚 参考文章: (1)通过手动抛自定义异常实现spring事务回滚 (2)https://www.cnblogs.com/javalanger/p/10912 ...
- spring注解事务及事务回滚失败的原因
背景 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程 ...
- Spring事务回滚实战
一.前置知识 1.Java异常中,Throwable是最顶层的父类,有Error和Exception两个子类 2.Exception分为运行时异常(RuntimeException及其子类)和非运行时 ...
- So easy Spring事务回滚机制
文章目录 事务控制的3种方式 伪代码 为什么不会滚呢 解决方案 声明式事务 注解事务 使用位置 基本用法 异常抛出 手动事务 设置回滚代码 设置回滚点 存储引擎 事务控制的3种方式 编程式事务:直接在 ...
- Spring 事务回滚实现原理
在Service层的方法上加上@Transactional注解,在发生错误时,方法会抛出运行时异常,随即Spring会自动回滚事务. Spring实现事务回滚的流程如下: 1.通过cglib,将方法上 ...
- Spring事务回滚典型场景
事务回滚场景 @Transactional注解默认事务传播级别为REQUIRED,默认回滚异常为RuntimeException 场景1 因为RuntimeException继承了Exception ...
最新文章
- 二极管7种应用电路详解之六
- 鸿雁电器oa系统中决策支持模块效果
- 【OpenCV3】阈值化操作——cv::threshold()与cv::adaptiveThreshold()详解
- why approver preview in Document builder is empty
- 采用计算机发布调度命令时 必须严格遵守,实用文档其他之铁路调度命令格式图片调度命令规范格式...
- linux然后防止ip欺骗,linux – 如何在iptables中防止ip欺骗?
- android 自定义progressdialog,android自定义ProgressDialog加载效果
- 数据库 memorial
- python和java的区别-Python与Java的区别与优劣?
- mysql连接操作_MySQL内连接操作
- 如何让自己电脑的鼠标指针变的更炫酷来看看这个吧
- 甲骨文大裁员,竟是因为它?
- css3中自定义变量
- 如何用Python画一只机器猫?
- web防火墙和waf防火墙的区别和选择
- 如果你是我眼中一滴泪,那么我永远不会哭
- %I64d 和%lld 的区别
- BZOJ 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机 bfs
- vscode设置#define定义宏
- 实施有效有价值的CI / CD流水线实践分享
热门文章
- git分支合并到另一个分支
- JavaWeb~http请求常见方法/报头header字段Host、User-Agent、Cookie、Referer、Content-type/Http响应解析及状态码
- 06、HTML文件和第一个网页
- 深入理解跨域SSO单点登录原理与技术
- 基于内容推荐算法的电影推荐系统
- “打农药”都不省心:勒索病毒冒充王者荣耀外挂
- 向量叉乘矩阵表示_向量点乘叉乘、矩阵、OpenGL变化
- python热力图代码_python热力图实现简单方法
- 带口罩了吗 Python教你 一行命令给猎狐 F4 带口罩 检测是否带口罩
- 用freeswitch架构自己的VOIP网络电话