科技风格设计网站,wordpress微信快捷支付宝,百度推广 帮做网站吗,微信小程序下单助手商家版#x1f4eb;作者简介#xff1a;小明java问道之路#xff0c;2022年度博客之星全国TOP3#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化#xff0c;文章内容兼具广度、深度、大厂技术方案#xff0c;对待技术喜欢推理加验证#xff0c;就职于… 作者简介小明java问道之路2022年度博客之星全国TOP3专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化文章内容兼具广度、深度、大厂技术方案对待技术喜欢推理加验证就职于知名金融公司后端高级工程师。 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家 如果此文还不错的话还请关注、点赞、收藏三连支持一下博主~ 文末获取联系 精彩专栏推荐订阅收藏 专栏系列点击解锁 学习路线点击解锁 知识定位 Redis从入门到精通与实战 Redis从入门到精通与实战 围绕原理源码讲解Redis面试知识点与实战 MySQL从入门到精通 MySQL从入门到精通 全面讲解MySQL知识与企业级MySQL实战 计算机底层原理 深入理解计算机系统CSAPP 以深入理解计算机系统为基石构件计算机体系和计算机思维 Linux内核源码解析 围绕Linux内核讲解计算机底层原理与并发 数据结构与企业题库精讲 数据结构与企业题库精讲 结合工作经验深入浅出适合各层次笔试面试算法题精讲 互联网架构分析与实战 企业系统架构分析实践与落地 行业最前沿视角专注于技术架构升级路线、架构实践 互联网企业防资损实践 互联网金融公司的防资损方法论、代码与实践 Java全栈白宝书 精通Java8与函数式编程 本专栏以实战为基础逐步深入Java8以及未来的编程模式 深入理解JVM 详细介绍内存区域、字节码、方法底层类加载和GC等知识 深入理解高并发编程 深入Liunx内核、汇编、C全方位理解并发编程 Spring源码分析 Spring核心七IOC/AOP等源码分析 MyBatis源码分析 MyBatis核心源码分析 Java核心技术 只讲Java核心技术 本文目录
本文导读
一、Spring事务失效问题
1、访问权限问题
2、方法用final修饰
3、方法内部调用
4、未被spring管理
5、表不支持事务
6、多线程调用
7、未开启事务
二、事务不回滚问题解析
1、错误的传播特性
2、try...catch了异常
3、手动抛了别的异常
4、自定义回滚异常
总结 本文导读
Spring事务失效问题主要有访问权限问题、方法用final修饰、方法内部调用、未被spring管理、表不支持事务、多线程调用、未开启事务等原因。事务不回滚问题主要有错误的传播特性、try...catch了异常、手动抛了别的异常、自定义回滚异常。
一、Spring事务失效问题
1、访问权限问题
事务方法被定义成了private这样会导致事务失效spring要求被代理方法必须是public的。
在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断如果目标方法不是public则TransactionAttribute返回null即不支持事务。
也就是说如果我们自定义的事务方法即目标方法它的访问权限不是public而是private、default或protected的话spring则不会提供事务功能
2、方法用final修饰
事务方法被定义成了final的这样会导致事务失效。
spring事务底层使用了aop也就是通过jdk动态代理或者cglib帮我们生成了代理类在代理类中实现的事务功能。但如果某个方法用final修饰了那么在它的代理类中就无法重写该方法而添加事务功能。
3、方法内部调用
在某个Service类的某个方法中调用另外一个事务方法。拥有事务的能力是因为spring aop生成代理了对象但是这种方法直接调用了this对象的方法所以不会生成事务在同一个类中的方法直接内部调用会导致事务失效。
解决方案Service类中注入自己Autowired prvate ServiceA serviceA;、新加一个Service类
4、未被spring管理
没加Controller、Service、Component、Repository等注解
5、表不支持事务
6、多线程调用
两个方法不在同一个线程中生成嵌套的线程从而是两个不同的事务。
如果看过spring事务源码的朋友可能会知道spring的事务是通过数据库连接来实现的。当前线程中保存了一个mapkey是数据源value是数据库连接。
7、未开启事务
springboot通过DataSourceTransactionManagerAutoConfiguration类已经默默的帮你开启了事务。
如果使用spring项目则需要在applicationContext.xml文件中手动配置事务相关参数如果没配置事务不会生效的。 二、事务不回滚问题解析
1、错误的传播特性
在使用Transactional注解时可以指定propagation参数的spring目前支持7种传播特性
NEVER这种类型的传播特性不支持事务如果有事务则会抛异常
REQUIREDREQUIRES_NEWNESTED三种传播特性才会创建新事务
2、try...catch了异常
3、手动抛了别的异常
spring事务默认情况下只会回滚RuntimeException和Error对于普通的Exception它不会回滚。
4、自定义回滚异常
例如Transactional(rollbackFor BusinessException.class)抛的其他异常不会回滚
总结
Spring事务失效问题主要有访问权限问题、方法用final修饰、方法内部调用、未被spring管理、表不支持事务、多线程调用、未开启事务等原因。事务不回滚问题主要有错误的传播特性、try...catch了异常、手动抛了别的异常、自定义回滚异常。