




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、SPRING 声明式事务处理源码分析声明式事务处理源码分析概述Spring中的事务处理Spring管理事务有声明式和编程式两种方式,声明式事务处理通过AOP的实现把事物管理代码作为方面封装来横向插入到业务代码中,使得事务管理代码和业务代码解藕。在这种方式我们结合IoC容器和Spirng已有的FactoryBean来对事务管理进行属性配置,比如传播行为,隔离级别等。事物管理Spring实现声明式事物管理有这么几个部分:1、对在上下文中配置的属性的处理,这里涉及的类是TransactionAttributeSourceAdvisor,这是一个通知器,用它来对属性值进行处理,属性信息放在Transa
2、ctionAttribute中来使用,而这些属性的处理往往是和对切入点的处理是结合起来的。对属性的处理放在类TransactionAttributeSource中完成。2、创建事物的过程,这个过程是委托给具体的事物管理器来创建的,但Spring通过TransactionStatus来传递相关的信息。3、对事物的处理通过对相关信息的判断来委托给具体的事物管理器完成。接口1、TransactionDefinition接口指定了事务隔离程度、事务传播、事务超时、只读状态2、TransactionStatus这个接口为处理事务提供简单的控制事务执行和查询事务状态的方法事务处理方式声明式声明式事务处理通
3、过AOP来实现事务的管理。Spring通过将事务作为切面横向插入到业务代码中,使得事务管理代码和业务代码解藕。在这种方式中,Spring结合IoC容器和FactoryBean对事务管理进行属性配置,比如传播行为,隔离级别等。编程式声明式最简单的方式就是通过配置TransactionProxyFactoryBean来实现TransactionProxyFactoryBean的具体实现publicclassTransactionProxyFactoryBeanextendsAbstractSingletonProxyFactoryBeanimplementsFactoryBean,BeanFact
4、oryAwaretransactionInterceptorprivatefinalTransactionInterceptortransactionInterceptor=newTransactionInterceptor();transactionInterceptor,Spring事务处理的AOP拦截器封装了Spring对事务处理的代码来支持声明式事务处理的实现publicvoidsetTransactionManager(PlatformTransactionManagertransactionManager)this.transactionInterceptor.setTransac
5、tionManager(transactionManager);setTransactionManager:把TransactionManager注入到TransactionInterceptor中去publicvoidsetTransactionAttributes(PropertiestransactionAttributes)this.transactionInterceptor.setTransactionAttributes(transactionAttributes);把bean配置文件中读到的事务管理的属性信息注入到TransactionInterceptor中protected
6、ObjectcreateMainInterceptor()this.transactionInterceptor.afterPropertiesSet();if(this.pointcut!=null)创建SpringAOP对事务处理的AdvisorreturnnewDefaultPointcutAdvisor(this.pointcut,this.transactionInterceptor);若没创建,则使用默认的Advisor声明式事物管理从类TransactionProxyFactoryBean,我们可以大致可以看到Spring实现声明式事物管理有这么几个部分:1、Transactio
7、nAttributeSourceAdvisor2、TransactionInterceptorTransactionAttributeSourceAdvisor对在上下文中配置的属性的处理,这里涉及的类是TransactionAttributeSourceAdvisor,这是一个Advisor,用它来对属性值进行处理,属性信息放在TransactionAttribute中来,而对这些属性的处理往往是和对切入点的处理是结合起来的。对属性的处理放在类TransactionAttributeSource中完成。TransactionInterceptorransactionInterceptor类,
8、作为SpringAOP事务处理的拦截器,TransactionManager和事务属性都是注册到TransactionInterceptor对象里的。TransactionInterceptor注入到SpringAOP在TransactionProxyFactoryBean中,还有一个方法afterPropertiesSet,这个方法在IOC初始化bean的时候被执行publicvoidafterPropertiesSet()TransactionProxyFactoryBean实际上使用ProxyFactory完成AOP的基本功能。ProxyFactoryproxyFactory=newPr
9、oxyFactory();if(this.preInterceptors!=null)for(inti=0;ithis.preInterceptors.length;i+)proxyFactory.addAdvisor(this.advisorAdapterRegistry.wrap(this.preInterceptorsi);两种通知器1、DefaultPointcutAdvisor2、TransactionAttributeSourceAdvisorproxyFactory.addAdvisor(this.advisorAdapterRegistry.wrap(createMainInt
10、erceptor();if(this.postInterceptors!=null)for(inti=0;icheckpropagationbehaviortofindouthowtobehave.returnhandleExistingTransaction(definition,transaction,debugEnabled);如果事务信息没有被配置,我们使用Spring默认的配置方式使用配置信息来创建我们需要的事务;比如传播属性和同步属性等,最后把创建过程中的信息收集起来放到TransactionStatus中返回if(definition.getTimeout()Transactio
11、nDefinition.TIMEOUT_DEFAULT)thrownewInvalidTimeoutException(Invalidtransactiontimeout,definition.getTimeout();if(definition.getPropagationBehavior()=TransactionDefinition.PROPAGATION_MANDATORY)thrownewIllegalTransactionStateException(Transactionpropagationmandatorybutnoexistingtransactionfound);如果没有
12、存在的transaction,查找propagationdoBegin(transaction,definition);booleannewSynchronization=(getTransactionSynchronization()!=SYNCHRONIZATION_NEVER);returnnewTransactionStatus(definition,transaction,true,newSynchronization,debugEnabled,null);elsebooleannewSynchronization=(getTransactionSynchronization()=S
13、YNCHRONIZATION_ALWAYS);returnnewTransactionStatus(definition,null,false,newSynchronization,debugEnabled,null);事务管理器创建事务,并将创建过程中得到的信息放到TransactionStatus中去,包括创建出来的事务prepareTransactionInfo通过调用prepareTransactionInfo完成事务创建的准备,创建过程中得到的信息存储在TransactionInfo对象中进行传递同时把信息和当前线程绑定TransactionInfotxInfo=newTransac
14、tionInfo(txAttr,joinpointIdentification);同样的需要把在getTransaction中得到的TransactionStatus放到TransactionInfo中txInfo.newTransactionStatus(status)绑定事务创建信息到当前线程txInfo.bindToThread()protectedvoidcommitTransactionAfterReturning(TransactionInfotxInfo)if(txInfo!=null&txInfo.hasTransaction()if(logger.isDebugEna
15、bled()logger.debug(Invokingcommitfortransactionon+txInfo.getJoinpointIdentification();this.transactionMmit(txInfo.getTransactionStatus();transactionManager通过transactionManager对事务进行处理,包括异常抛出和正常的提交事务,具体的事务管理器由用户程序设定protectedvoidcompleteTransactionAfterThrowing(TransactionInfotxInfo,Throwableex)if(txIn
16、fo!=null&txInfo.hasTransaction()if(txInfo.transactionAttribute.rollbackOn(ex)trythis.transactionManager.rollback(txInfo.getTransactionStatus();elsetrythis.transactionMmit(txInfo.getTransactionStatus();protectedvoidcommitTransactionAfterReturning(TransactionInfotxInfo)if(txInfo!=null&txInfo.h
17、asTransaction()this.transactionMmit(txInfo.getTransactionStatus();transactionManager进行事务处理Spring通过以上代码对transactionManager进行事务处理的过程进行了AOP包装,到这里我们看到为了方便客户实现声明式的事务处理,Spring做了许多工作TransactionDefinitiontd=newDefaultTransactionDefinition();TransactionStatusstatus=transactionManager.getTransaction(td);这里选取了
18、默认的事务配置DefaultTransactionDefinition,同时在创建事物的过程中得到TransactionStatus,然后通过直接调用事务管理器的相关方法就能完成事务处理声明式事务处理也同样实现了类似的过程,只是因为采用了声明的方法,需要增加对属性的读取处理,并且需要把整个过程整合到SpringAOP框架中和IoC容器中去的过程transactionManager-DataSourceTransactionManager通过使用AbstractPlatformTransactionManager使用模板方法,这些都体现了对具体平台相关的事务管理器操作的封装publicfinalvoidcommit(TransactionStatusstatus)throwsTransactionException通过对TransactionStatus的具体状态的判断,来决定具体的事务处理trytriggerBeforeCommit(status);triggerBeforeCompletion(status);beforeCompletionInvoked=true;booleanglobalRollbackOnly=false;if(st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年湖北省十堰市单招职业倾向性测试题库新版
- 2024年医用供应装置项目投资申请报告
- 生物-云南省师范大学附属中学2025届高三下学期开学考试试题和答案
- 2025年度国际贸易付款委托三方协议
- 2025年度全包家装装修与智能家居智能安防报警系统合同
- 2025年度单身公寓房产租赁合同(含智能家居)
- 2025年度信用卡旅游保险借款合同
- 二零二五年度劳动合同解除后离职员工离职后职业发展支持合同
- 2025年度XX小区智慧物业管理系统服务协议书
- 2025年度兼职协议书-旅游行业导游兼职人员合作协议
- DBJ 46-027-2013 海南省建筑塔式起重机安装使用安全评定规程
- SJG 103-2021 无障碍设计标准-高清现行
- 皇冠假日酒店智能化系统安装工程施工合同范本
- 路面工程重点、关键、和难点工程的施工方案(技术标)
- 港口集装箱物流系统建模与仿真技术研究-教学平台课件
- 合肥市城市大脑·数字底座白皮书2020
- 杭州湾跨海大桥项目案例ppt课件
- (完整版)光荣榜25张模板
- 工业催化剂作用原理—金属氧化物催化剂
- 优秀教材推荐意见(真实的专家意见)
- QTD01钢质焊接气瓶检验工艺指导书
评论
0/150
提交评论