看源码和你说说Spring事务为什么会失效?

本文探讨了Spring事务管理的多种方式,包括不用Spring管理事务、编程式事务管理和声明式事务管理。重点讲解了事务失效的常见场景,如异常被捕获、自调用、非public方法和异常类型限制。同时,分析了Spring事务管理的源码,解释了事务开启、提交和回滚的逻辑,以及传播行为。并提供了避免事务失效的解决方案。
摘要由CSDN通过智能技术生成

不用Spring管理事务?

如果对AOP的实现不太熟悉的话可以看我之前的文章,或者到我网站www.javashitang.com上查看系列文章

2w字搞懂Spring AOP的前世今生

让我们先来看一下不用spring管理事务时,各种框架是如何管理事务的

使用JDBC来管理事务

使用Hibernate来管理事务业务逻辑和事务代码是耦合到一块的,并且和框架的具体api绑定了。当我们换一种框架来实现时,里面对事务控制的代码就要推倒重写,并不一定能保证替换后的api和之前的api有相同的行为。

「统一的事务抽象」

基于这些问题,Spring抽象了一些事务相关的顶层接口。无论是全局事务还是本地事务,JTA,JDBC还是Hibernate,Spring都使用统一的编程模型。使得应用程序可以很容易的在全局事务与本地事务,或者不同事物框架之间进行切换。

「下图为Spring事物抽象的核心类」

常用api 接口
PlatformTransactionManager 对事务进行管理
TransactionDefinition 定义事务的相关属性,例如隔离级别,传播行为
TransactionStatus 保存事务状态

针对不同的数据访问技术,使用不用的PlatformTransactionManager类即可

数据访问技术 PlatformTransactionManager实现类
JDBC/Mybatis DataSourceTransactionManager
Hibernate HibernateTransactionManager
Jpa JpaTransactionManager
Jms JmsTransactionManager

编程式事务管理

当我们使用Spring的事务时,可以使用编程式事务或者声明式事务。

当使用编程式事务的时候,可以直接使用事务的顶层接口,也可以使用模版类TransactionTemplate

使用PlatformTransactionManager

使用TransactionTemplate

当我们直接使用PlatformTransactionManager来管理事务时,有很多模版代码。例如业务代码正常执行,提交事务,否则回滚事务。我们可以把这部分模版代码封装成一个模版类,这样使用起来就很方便了,如下所示

如下图所示,TransactionTemplate#execute方法就是一个典型的模版方法我们可以传入如下2个接口的实现类来执行业务逻辑,TransactionCallback(需要返回执行结果)或

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值