Spring 聲明式事務(wù)處理源碼分析_第1頁(yè)
Spring 聲明式事務(wù)處理源碼分析_第2頁(yè)
Spring 聲明式事務(wù)處理源碼分析_第3頁(yè)
Spring 聲明式事務(wù)處理源碼分析_第4頁(yè)
Spring 聲明式事務(wù)處理源碼分析_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、SPRING 聲明式事務(wù)處理源碼分析聲明式事務(wù)處理源碼分析概述Spring中的事務(wù)處理Spring管理事務(wù)有聲明式和編程式兩種方式,聲明式事務(wù)處理通過(guò)AOP的實(shí)現(xiàn)把事物管理代碼作為方面封裝來(lái)橫向插入到業(yè)務(wù)代碼中,使得事務(wù)管理代碼和業(yè)務(wù)代碼解藕。在這種方式我們結(jié)合IoC容器和Spirng已有的FactoryBean來(lái)對(duì)事務(wù)管理進(jìn)行屬性配置,比如傳播行為,隔離級(jí)別等。事物管理Spring實(shí)現(xiàn)聲明式事物管理有這么幾個(gè)部分:1、對(duì)在上下文中配置的屬性的處理,這里涉及的類是TransactionAttributeSourceAdvisor,這是一個(gè)通知器,用它來(lái)對(duì)屬性值進(jìn)行處理,屬性信息放在Transa

2、ctionAttribute中來(lái)使用,而這些屬性的處理往往是和對(duì)切入點(diǎn)的處理是結(jié)合起來(lái)的。對(duì)屬性的處理放在類TransactionAttributeSource中完成。2、創(chuàng)建事物的過(guò)程,這個(gè)過(guò)程是委托給具體的事物管理器來(lái)創(chuàng)建的,但Spring通過(guò)TransactionStatus來(lái)傳遞相關(guān)的信息。3、對(duì)事物的處理通過(guò)對(duì)相關(guān)信息的判斷來(lái)委托給具體的事物管理器完成。接口1、TransactionDefinition接口指定了事務(wù)隔離程度、事務(wù)傳播、事務(wù)超時(shí)、只讀狀態(tài)2、TransactionStatus這個(gè)接口為處理事務(wù)提供簡(jiǎn)單的控制事務(wù)執(zhí)行和查詢事務(wù)狀態(tài)的方法事務(wù)處理方式聲明式聲明式事務(wù)處理通

3、過(guò)AOP來(lái)實(shí)現(xiàn)事務(wù)的管理。Spring通過(guò)將事務(wù)作為切面橫向插入到業(yè)務(wù)代碼中,使得事務(wù)管理代碼和業(yè)務(wù)代碼解藕。在這種方式中,Spring結(jié)合IoC容器和FactoryBean對(duì)事務(wù)管理進(jìn)行屬性配置,比如傳播行為,隔離級(jí)別等。編程式聲明式最簡(jiǎn)單的方式就是通過(guò)配置TransactionProxyFactoryBean來(lái)實(shí)現(xiàn)TransactionProxyFactoryBean的具體實(shí)現(xiàn)publicclassTransactionProxyFactoryBeanextendsAbstractSingletonProxyFactoryBeanimplementsFactoryBean,BeanFact

4、oryAwaretransactionInterceptorprivatefinalTransactionInterceptortransactionInterceptor=newTransactionInterceptor();transactionInterceptor,Spring事務(wù)處理的AOP攔截器封裝了Spring對(duì)事務(wù)處理的代碼來(lái)支持聲明式事務(wù)處理的實(shí)現(xiàn)publicvoidsetTransactionManager(PlatformTransactionManagertransactionManager)this.transactionInterceptor.setTransac

5、tionManager(transactionManager);setTransactionManager:把TransactionManager注入到TransactionInterceptor中去publicvoidsetTransactionAttributes(PropertiestransactionAttributes)this.transactionInterceptor.setTransactionAttributes(transactionAttributes);把bean配置文件中讀到的事務(wù)管理的屬性信息注入到TransactionInterceptor中protected

6、ObjectcreateMainInterceptor()this.transactionInterceptor.afterPropertiesSet();if(this.pointcut!=null)創(chuàng)建SpringAOP對(duì)事務(wù)處理的AdvisorreturnnewDefaultPointcutAdvisor(this.pointcut,this.transactionInterceptor);若沒(méi)創(chuàng)建,則使用默認(rèn)的Advisor聲明式事物管理從類TransactionProxyFactoryBean,我們可以大致可以看到Spring實(shí)現(xiàn)聲明式事物管理有這么幾個(gè)部分:1、Transactio

7、nAttributeSourceAdvisor2、TransactionInterceptorTransactionAttributeSourceAdvisor對(duì)在上下文中配置的屬性的處理,這里涉及的類是TransactionAttributeSourceAdvisor,這是一個(gè)Advisor,用它來(lái)對(duì)屬性值進(jìn)行處理,屬性信息放在TransactionAttribute中來(lái),而對(duì)這些屬性的處理往往是和對(duì)切入點(diǎn)的處理是結(jié)合起來(lái)的。對(duì)屬性的處理放在類TransactionAttributeSource中完成。TransactionInterceptorransactionInterceptor類,

8、作為SpringAOP事務(wù)處理的攔截器,TransactionManager和事務(wù)屬性都是注冊(cè)到TransactionInterceptor對(duì)象里的。TransactionInterceptor注入到SpringAOP在TransactionProxyFactoryBean中,還有一個(gè)方法afterPropertiesSet,這個(gè)方法在IOC初始化bean的時(shí)候被執(zhí)行publicvoidafterPropertiesSet()TransactionProxyFactoryBean實(shí)際上使用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);如果事務(wù)信息沒(méi)有被配置,我們使用Spring默認(rèn)的配置方式使用配置信息來(lái)創(chuàng)建我們需要的事務(wù);比如傳播屬性和同步屬性等,最后把創(chuàng)建過(guò)程中的信息收集起來(lái)放到TransactionStatus中返回if(definition.getTimeout()Transactio

11、nDefinition.TIMEOUT_DEFAULT)thrownewInvalidTimeoutException(Invalidtransactiontimeout,definition.getTimeout();if(definition.getPropagationBehavior()=TransactionDefinition.PROPAGATION_MANDATORY)thrownewIllegalTransactionStateException(Transactionpropagationmandatorybutnoexistingtransactionfound);如果沒(méi)有

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);事務(wù)管理器創(chuàng)建事務(wù),并將創(chuàng)建過(guò)程中得到的信息放到TransactionStatus中去,包括創(chuàng)建出來(lái)的事務(wù)prepareTransactionInfo通過(guò)調(diào)用prepareTransactionInfo完成事務(wù)創(chuàng)建的準(zhǔn)備,創(chuàng)建過(guò)程中得到的信息存儲(chǔ)在TransactionInfo對(duì)象中進(jìn)行傳遞同時(shí)把信息和當(dāng)前線程綁定TransactionInfotxInfo=newTransac

14、tionInfo(txAttr,joinpointIdentification);同樣的需要把在getTransaction中得到的TransactionStatus放到TransactionInfo中txInfo.newTransactionStatus(status)綁定事務(wù)創(chuàng)建信息到當(dāng)前線程txInfo.bindToThread()protectedvoidcommitTransactionAfterReturning(TransactionInfotxInfo)if(txInfo!=null&txInfo.hasTransaction()if(logger.isDebugEna

15、bled()logger.debug(Invokingcommitfortransactionon+txInfo.getJoinpointIdentification();this.transactionMmit(txInfo.getTransactionStatus();transactionManager通過(guò)transactionManager對(duì)事務(wù)進(jìn)行處理,包括異常拋出和正常的提交事務(wù),具體的事務(wù)管理器由用戶程序設(shè)定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進(jìn)行事務(wù)處理Spring通過(guò)以上代碼對(duì)transactionManager進(jìn)行事務(wù)處理的過(guò)程進(jìn)行了AOP包裝,到這里我們看到為了方便客戶實(shí)現(xiàn)聲明式的事務(wù)處理,Spring做了許多工作TransactionDefinitiontd=newDefaultTransactionDefinition();TransactionStatusstatus=transactionManager.getTransaction(td);這里選取了

18、默認(rèn)的事務(wù)配置DefaultTransactionDefinition,同時(shí)在創(chuàng)建事物的過(guò)程中得到TransactionStatus,然后通過(guò)直接調(diào)用事務(wù)管理器的相關(guān)方法就能完成事務(wù)處理聲明式事務(wù)處理也同樣實(shí)現(xiàn)了類似的過(guò)程,只是因?yàn)椴捎昧寺暶鞯姆椒?,需要增加?duì)屬性的讀取處理,并且需要把整個(gè)過(guò)程整合到SpringAOP框架中和IoC容器中去的過(guò)程transactionManager-DataSourceTransactionManager通過(guò)使用AbstractPlatformTransactionManager使用模板方法,這些都體現(xiàn)了對(duì)具體平臺(tái)相關(guān)的事務(wù)管理器操作的封裝publicfinalvoidcommit(TransactionStatusstatus)throwsTransactionException通過(guò)對(duì)TransactionStatus的具體狀態(tài)的判斷,來(lái)決定具體的事務(wù)處理trytriggerBeforeCommit(status);triggerBeforeCompletion(status);beforeCompletionInvoked=true;booleanglobalRollbackOnly=false;if(st

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論