本文以申明式事务为例,开始下探,分析spring事务的源码结构,再以mybatis为例,分析spring事务是如何作用于ORM的。
首先看看spring的配置文件,简而言之,TransactionAttributeSourceAdvisor采用AOP方式,将事务transactionInterceptor织入注解的特定的方法上
<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> <property name="transactionInterceptor"><ref bean="transactionInterceptor"/></property> </bean> <bean id="transactionInterceptor" class="com.CustomerTransactionInterceptor"> <constructor-arg name="ptm" ref="shardingTransactionManager"></constructor-arg> <constructor-arg name="tas" ref="transactionAttributeSource"></constructor-arg> </bean> <bean id="customerSpringTransactionAnnotationParser" class="com.CustomerSpringTransactionAnnotationParser"> <constructor-arg name="transactionManagerSpringBeanId"> <value>shardingTransactionManager</value> </constructor-arg> </bean> <bean id="transactionAttributeSource" class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"> <constructor-arg name="annotationParser" ref="customerSpringTransactionAnnotationParser"></constructor-arg> </bean>
那实际上,transactionInterceptor是实际调用shardingTransactionManager入口,它的父类TransactionAspectSupport封装了操作事务的具体代码
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {
最终,在这个类里,我们找到了核心的事务操作代码,很清晰的,几步
1. 从属性中获取事务属性配置,从BeanFactory中去除TransactionManager
2. 开启事务,createTransactionIfNecessary
3. 执行业务方法
4. 遇错回滚,completeTransactionAfterThrowing方法判断,该Exception类型是否回滚,不回滚执行提交
5. 清理事务信息,cleanupTransactionInfo将当前TransactionInfo设置为old
6. 提交,commitTransactionAfterReturning执行提交
protected Object invokeWithinTransaction(Method method, Class targetClass, final InvocationCallback invocation)
final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass); final PlatformTransactionManager tm = determineTransactionManager(txAttr); final String joinpointIdentification = methodIdentification(method, targetClass); if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) { // Standard transaction demarcation with getTransaction and commit/rollback calls. TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification); Object retVal = null; try { // This is an around advice: Invoke the next interceptor in the chain. // This will normally result in a target object being invoked. retVal = invocation.proceedWithInvocation(); } catch (Throwable ex) { // target invocation exception completeTransactionAfterThrowing(txInfo, ex); throw ex; } finally { cleanupTransactionInfo(txInfo); } commitTransactionAfterReturning(txInfo); return retVal; }
事务的外围展现就是这么简单,内部的处理的复杂性主要有以下几点
1. 由于拦截事务是嵌套的,所以产生了以上6步执行的嵌套问题,这就产生了事务的传播特性
2. 底层数据库的不同,数据库驱动程序不同,产生了事务的兼容性问题
3. ORM框架百花齐放,如何能和spring事务无缝整合,也是一个棘手的问题
接下来我们先以JDBC事务为例进行说明
先看xml文件的配置,可以知道JDBC的事务管理器为DataSourceTransactionManager
<!-- Sharding start --> <bean id="shardingTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="shardingDataSource" /> </bean>首先,我们先看Spring是如何兼容JDBC驱动的事务的
DataSourceTransactionManager和JDBC事务的具体封装在spring-jdbc-xxx.jar中,DataSourceTransactionManager的父类AbstractPlatformTransactionManager在spring-tx-xxx.jar中,其中后者为spring对事务的抽象层,前者是JDBC事务的具体实现。代码中设计底层的交给DataSourceTransactionManager子类实现,AbstractPlatformTransactionManager封装上层接口,事务的调用都走上层接口。
接下来我们从上面的六步着手,逐层下探
1. 事务的创建,方法的调用流程如下
TransactionAspectSupport.createTransactionIfNecessary->AbstractPlatformTransactionManager.getTransaction->DataSourceTransactionManager.*
AbstractPlatformTransactionManager.getTransaction方法
public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { //调用DataSourceTransactionManager获得transaction句柄对象 Object transaction = doGetTransaction(); //如果事务存在,根据事务的传播类型,进行对应的处理 if (isExistingTransaction(transaction)) { return handleExistingTransaction(definition, transaction, debugEnabled); } //以前不存在事务,doBegin启动事务 else if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED || definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW || definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) { doBegin(transaction, definition);
相关推荐
本教程将通过一系列的案例,从基础到深入,逐步剖析Spring框架的核心机制,帮助你理解和掌握Spring的源码,从而更好地运用到实际项目中。 首先,我们从“tiny-spring-step-1-container-register-and-get.zip”开始...
本文将对这个版本的源码进行深入剖析,帮助读者更好地理解和利用Spring框架。 首先,源码分析通常从项目结构开始。在解压后的文件中,我们看到有三个主要的子文件:`spring-5.2.8.RELEASE-dist.zip`、`spring-5.2.8...
在不使用这个库的情况下,开发者需要手动管理SqlSessionFactory或SqlSession,并确保它们在Spring事务边界内正确关闭。而MyBatis-Spring通过提供SqlSessionTemplate和SqlSessionDaoSupport等工具类,使得MyBatis可以...
本篇将深入剖析这三者如何协同工作,并提供实际范例应用。 首先,Struts2作为MVC(模型-视图-控制器)框架,负责处理HTTP请求,管理应用的业务逻辑流程。它提供了灵活的拦截器机制,通过配置Action和Result来定义...
图灵Java高级互联网架构师第6期源码框架专题笔记,内容...16-SpringMVC源码 — 请求流程源码深入剖析-徐庶 17-SpringMVC源码—父子容器启动原理深入剖析-徐庶 18-MyBatis源码—体系介绍和配置文件解析源码剖析-徐庶 ...
本文将深入剖析Spring框架3.0.5.RELEASE的依赖结构,帮助开发者更好地理解和使用这个版本,特别是其在Spring和SpringMvc开发中的关键作用。 首先,"spring-framework-3.0.5.RELEASE-dependencies"这一标题表明了...
《精通Spring2.x-企业应用开发详解》这本书深入剖析了Spring框架的核心特性和在实际企业应用中的使用方式。源代码涵盖了第二至第六章的内容,这五个章节分别涉及了Spring的基础、依赖注入、AOP(面向切面编程)、...
《深入剖析Spring Data Hadoop 1.0.0源码》 Spring Data Hadoop是Spring框架的一个重要组件,它提供了一种优雅的方式来访问和操作Hadoop生态系统中的数据。这个源码包“spring-data-hadoop-1.0.0”为我们揭示了...
《深入剖析Spring Framework 5.2.5.RELEASE》 Spring Framework是Java开发中的一个核心框架,它为创建高效、灵活且可测试的Java应用程序提供了基础。本篇将围绕Spring 5.2.5.RELEASE版本,从源码层面探讨其设计理念...
本文将对这个版本的源码进行深入剖析,帮助读者理解其核心机制和设计思想。 1. **模块架构** Spring Framework 5.2.15.RELEASE由多个模块组成,包括Core Container(核心容器)、Data Access/Integration(数据...
《Spring 2.0 技术手册》是继 Spring 1.0 之后的重要著作,作者林信良针对 Spring 框架在 2.0 版本中的新特性进行了深入剖析与讲解。本书不仅适合于已经有一定 Java 开发基础的学习者,也适用于想要深入了解 Spring ...
四、Spring事务管理 1. 编程式事务管理:通过PlatformTransactionManager接口进行事务管理,适用于手动控制事务的场景。 2. 声明式事务管理:基于AOP,通过@Transactional注解实现事务的自动管理,简化了事务处理...
这个"Struts2+Hibernate+Spring整合开发深入剖析与范例应用02"的学习资源,很可能是关于这三大框架集成使用的详细教程或案例集。02这个文件名可能代表系列的第二部分,意味着它可能在前一部分的基础上进一步深入讲解...
本文将围绕"spring-framework-master-2018.1.1.zip"这一版本,对Spring框架进行深入的剖析,带你领略其魅力。 首先,Spring的核心理念是依赖注入(Dependency Injection,简称DI),它使得应用程序的组件之间解耦,...
5. Spring事务管理 - 事务的概念 - 编程式事务管理 - 声明式事务管理 - 事务的隔离级别与传播行为 6. Spring测试 - 单元测试 - 集成测试 - 测试工具与支持 7. Spring与其他技术的整合 - Spring Boot - ...
【Spring AOP 深入剖析】 Spring AOP(面向切面编程)是Spring框架的核心特性,它作为面向对象编程(OOP)的一种补充,旨在解决业务处理过程中的横切关注点,例如日志记录、权限检查等。OOP关注的是对象的属性和...
本篇将深入剖析"spring-mybatis-1.2.5-src.zip"中的源码,帮助读者理解这两个框架的整合机制及其工作原理。 1. **Spring的核心概念** - **依赖注入(Dependency Injection,DI)**:Spring通过DI来管理对象的创建...
《深入剖析Spring Framework 5.1.13.RELEASE源码》 Spring Framework作为Java开发领域中的核心框架,以其强大的功能和灵活性深受开发者喜爱。官方原版源码spring-framework-5.1.13.RELEASE.zip为我们提供了深入了解...
在"Struts2+Hibernate+Spring整合开发深入剖析与范例应用05"的源码中,我们可以看到具体的配置文件(如struts.xml、spring-context.xml、hibernate.cfg.xml)、Action类、Service类、DAO类以及实体类等。通过对这些...
《互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析》以SSM 的核心代码剖析为基础,突破Java Web 研发瓶颈的束缚,选取Spring、SpringMVC 和MyBatis 框架中易于理解的版本,深入剖析了其中各个...