下面是一个回滚事务的案例

需求是:转账失败后 转账的事务会回滚,日志事务不会回滚

出现的问题是:

日志事务开启了@Transactional(propagation = Propagation.REQUIRES_NEW)

转账事务开启了@Transactional(rollbackFor = {IOException.class})

转账事务中间使用Try catch finally 使出现异常,日志事务能照常运行

失败情况是:账单有一个执行了,事务未回滚,日志正常记录转账失败信息

失败的原因是:事务管理的机制是AOP监听,当事件出现非runtime异常时候,AOP反射动态代理就无法运行,无法进行事务回滚(详细的我也说不清楚),说明下, 只有runtime 异常和 error异常,才会被捕获回滚

解决办法有2种:

  1. 不使用catch捕获, 使用throws在方法声明出抛出异常, 值得注意的是,try finally可以正常使用

  2. 这种办法有点投机的嫌疑,方法是使用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事务回滚失败相关推荐

  1. java 事务回滚注解_Java Spring 事务回滚详解

    这篇文章主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下 spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代 ...

  2. spring事务回滚理解

    1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了. 声明式事务:就是使用SpringAop配置事务, ...

  3. Spring事务回滚和异常类

    转载自 https://www.cnblogs.com/tianyuchen/p/6678084.html 1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和E ...

  4. 通过手动抛自定义异常实现spring事务回滚

    通过手动抛自定义异常实现spring事务回滚 参考文章: (1)通过手动抛自定义异常实现spring事务回滚 (2)https://www.cnblogs.com/javalanger/p/10912 ...

  5. spring注解事务及事务回滚失败的原因

    背景 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程 ...

  6. Spring事务回滚实战

    一.前置知识 1.Java异常中,Throwable是最顶层的父类,有Error和Exception两个子类 2.Exception分为运行时异常(RuntimeException及其子类)和非运行时 ...

  7. So easy Spring事务回滚机制

    文章目录 事务控制的3种方式 伪代码 为什么不会滚呢 解决方案 声明式事务 注解事务 使用位置 基本用法 异常抛出 手动事务 设置回滚代码 设置回滚点 存储引擎 事务控制的3种方式 编程式事务:直接在 ...

  8. Spring 事务回滚实现原理

    在Service层的方法上加上@Transactional注解,在发生错误时,方法会抛出运行时异常,随即Spring会自动回滚事务. Spring实现事务回滚的流程如下: 1.通过cglib,将方法上 ...

  9. Spring事务回滚典型场景

    事务回滚场景 @Transactional注解默认事务传播级别为REQUIRED,默认回滚异常为RuntimeException 场景1 因为RuntimeException继承了Exception ...

最新文章

  1. 二极管7种应用电路详解之六
  2. 鸿雁电器oa系统中决策支持模块效果
  3. 【OpenCV3】阈值化操作——cv::threshold()与cv::adaptiveThreshold()详解
  4. why approver preview in Document builder is empty
  5. 采用计算机发布调度命令时 必须严格遵守,实用文档其他之铁路调度命令格式图片调度命令规范格式...
  6. linux然后防止ip欺骗,linux – 如何在iptables中防止ip欺骗?
  7. android 自定义progressdialog,android自定义ProgressDialog加载效果
  8. 数据库 memorial
  9. python和java的区别-Python与Java的区别与优劣?
  10. mysql连接操作_MySQL内连接操作
  11. 如何让自己电脑的鼠标指针变的更炫酷来看看这个吧
  12. 甲骨文大裁员,竟是因为它?
  13. css3中自定义变量
  14. 如何用Python画一只机器猫?
  15. web防火墙和waf防火墙的区别和选择
  16. 如果你是我眼中一滴泪,那么我永远不会哭
  17. %I64d 和%lld 的区别
  18. BZOJ 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机 bfs
  19. vscode设置#define定义宏
  20. 实施有效有价值的CI / CD流水线实践分享

热门文章

  1. git分支合并到另一个分支
  2. JavaWeb~http请求常见方法/报头header字段Host、User-Agent、Cookie、Referer、Content-type/Http响应解析及状态码
  3. 06、HTML文件和第一个网页
  4. 深入理解跨域SSO单点登录原理与技术
  5. 基于内容推荐算法的电影推荐系统
  6. “打农药”都不省心:勒索病毒冒充王者荣耀外挂
  7. 向量叉乘矩阵表示_向量点乘叉乘、矩阵、OpenGL变化
  8. python热力图代码_python热力图实现简单方法
  9. 带口罩了吗 Python教你 一行命令给猎狐 F4 带口罩 检测是否带口罩
  10. 用freeswitch架构自己的VOIP网络电话