




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、SPRING 聲明式事務(wù)處理源碼分析聲明式事務(wù)處理源碼分析概述Spring中的事務(wù)處理Spring管理事務(wù)有聲明式和編程式兩種方式,聲明式事務(wù)處理通過AOP的實(shí)現(xiàn)把事物管理代碼作為方面封裝來橫向插入到業(yè)務(wù)代碼中,使得事務(wù)管理代碼和業(yè)務(wù)代碼解藕。在這種方式我們結(jié)合IoC容器和Spirng已有的FactoryBean來對事務(wù)管理進(jìn)行屬性配置,比如傳播行為,隔離級別等。事物管理Spring實(shí)現(xiàn)聲明式事物管理有這么幾個(gè)部分:1、對在上下文中配置的屬性的處理,這里涉及的類是TransactionAttributeSourceAdvisor,這是一個(gè)通知器,用它來對屬性值進(jìn)行處理,屬性信息放在Transa
2、ctionAttribute中來使用,而這些屬性的處理往往是和對切入點(diǎn)的處理是結(jié)合起來的。對屬性的處理放在類TransactionAttributeSource中完成。2、創(chuàng)建事物的過程,這個(gè)過程是委托給具體的事物管理器來創(chuàng)建的,但Spring通過TransactionStatus來傳遞相關(guān)的信息。3、對事物的處理通過對相關(guān)信息的判斷來委托給具體的事物管理器完成。接口1、TransactionDefinition接口指定了事務(wù)隔離程度、事務(wù)傳播、事務(wù)超時(shí)、只讀狀態(tài)2、TransactionStatus這個(gè)接口為處理事務(wù)提供簡單的控制事務(wù)執(zhí)行和查詢事務(wù)狀態(tài)的方法事務(wù)處理方式聲明式聲明式事務(wù)處理通
3、過AOP來實(shí)現(xiàn)事務(wù)的管理。Spring通過將事務(wù)作為切面橫向插入到業(yè)務(wù)代碼中,使得事務(wù)管理代碼和業(yè)務(wù)代碼解藕。在這種方式中,Spring結(jié)合IoC容器和FactoryBean對事務(wù)管理進(jìn)行屬性配置,比如傳播行為,隔離級別等。編程式聲明式最簡單的方式就是通過配置TransactionProxyFactoryBean來實(shí)現(xiàn)TransactionProxyFactoryBean的具體實(shí)現(xiàn)publicclassTransactionProxyFactoryBeanextendsAbstractSingletonProxyFactoryBeanimplementsFactoryBean,BeanFact
4、oryAwaretransactionInterceptorprivatefinalTransactionInterceptortransactionInterceptor=newTransactionInterceptor();transactionInterceptor,Spring事務(wù)處理的AOP攔截器封裝了Spring對事務(wù)處理的代碼來支持聲明式事務(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對事務(wù)處理的AdvisorreturnnewDefaultPointcutAdvisor(this.pointcut,this.transactionInterceptor);若沒創(chuàng)建,則使用默認(rèn)的Advisor聲明式事物管理從類TransactionProxyFactoryBean,我們可以大致可以看到Spring實(shí)現(xiàn)聲明式事物管理有這么幾個(gè)部分:1、Transactio
7、nAttributeSourceAdvisor2、TransactionInterceptorTransactionAttributeSourceAdvisor對在上下文中配置的屬性的處理,這里涉及的類是TransactionAttributeSourceAdvisor,這是一個(gè)Advisor,用它來對屬性值進(jìn)行處理,屬性信息放在TransactionAttribute中來,而對這些屬性的處理往往是和對切入點(diǎn)的處理是結(jié)合起來的。對屬性的處理放在類TransactionAttributeSource中完成。TransactionInterceptorransactionInterceptor類,
8、作為SpringAOP事務(wù)處理的攔截器,TransactionManager和事務(wù)屬性都是注冊到TransactionInterceptor對象里的。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ù)信息沒有被配置,我們使用Spring默認(rèn)的配置方式使用配置信息來創(chuàng)建我們需要的事務(wù);比如傳播屬性和同步屬性等,最后把創(chuàng)建過程中的信息收集起來放到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);事務(wù)管理器創(chuàng)建事務(wù),并將創(chuàng)建過程中得到的信息放到TransactionStatus中去,包括創(chuàng)建出來的事務(wù)prepareTransactionInfo通過調(diào)用prepareTransactionInfo完成事務(wù)創(chuàng)建的準(zhǔn)備,創(chuàng)建過程中得到的信息存儲在TransactionInfo對象中進(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.isDebugEnabled
15、()logger.debug(Invokingcommitfortransactionon+txInfo.getJoinpointIdentification();this.transactionMmit(txInfo.getTransactionStatus();transactionManager通過transactionManager對事務(wù)進(jìn)行處理,包括異常拋出和正常的提交事務(wù),具體的事務(wù)管理器由用戶程序設(shè)定protectedvoidcompleteTransactionAfterThrowing(TransactionInfotxInfo,Throwableex)if(txInfo!=
16、null&txInfo.hasTransaction()if(txInfo.transactionAttribute.rollbackOn(ex)trythis.transactionManager.rollback(txInfo.getTransactionStatus();elsetrythis.transactionMmit(txInfo.getTransactionStatus();protectedvoidcommitTransactionAfterReturning(TransactionInfotxInfo)if(txInfo!=null&txInfo.hasTransactio
17、n()this.transactionMmit(txInfo.getTransactionStatus();transactionManager進(jìn)行事務(wù)處理Spring通過以上代碼對transactionManager進(jìn)行事務(wù)處理的過程進(jìn)行了AOP包裝,到這里我們看到為了方便客戶實(shí)現(xiàn)聲明式的事務(wù)處理,Spring做了許多工作TransactionDefinitiontd=newDefaultTransactionDefinition();TransactionStatusstatus=transactionManager.getTransaction(td);這里選取了默認(rèn)的事務(wù)配置Defau
18、ltTransactionDefinition,同時(shí)在創(chuàng)建事物的過程中得到TransactionStatus,然后通過直接調(diào)用事務(wù)管理器的相關(guān)方法就能完成事務(wù)處理聲明式事務(wù)處理也同樣實(shí)現(xiàn)了類似的過程,只是因?yàn)椴捎昧寺暶鞯姆椒?,需要增加對屬性的讀取處理,并且需要把整個(gè)過程整合到SpringAOP框架中和IoC容器中去的過程transactionManager-DataSourceTransactionManager通過使用AbstractPlatformTransactionManager使用模板方法,這些都體現(xiàn)了對具體平臺相關(guān)的事務(wù)管理器操作的封裝publicfinalvoidcommit(TransactionStatusstatus)throwsTransactionException通過對TransactionStatus的具體狀態(tài)的判斷,來決定具體的事務(wù)處理trytriggerBeforeCommit(status);triggerBeforeCompletion(status);beforeCompletionInvoked=true;booleanglobalRollbackOnly=false;if(sta
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第2.6講 指數(shù)與指數(shù)函數(shù)(解析版)-2024年高考數(shù)學(xué)一輪復(fù)習(xí)精講精練寶典(新高考專用)
- 浙教版2023小學(xué)信息技術(shù)六年級上冊《算法的多樣性》教學(xué)設(shè)計(jì)及反思
- (一模)萍鄉(xiāng)市2025年高三第一次模擬考試歷史試卷(含答案解析)
- 2025年B2B營銷業(yè)務(wù) AI提示詞手冊
- 陶瓷攔水帶施工方案
- 高樓地鐵隧道施工方案
- 砂漿基礎(chǔ)知識培訓(xùn)課件
- 2025年山東聊城高三一模高考數(shù)學(xué)試卷試題(含答案詳解)
- 2025年藥具科技工作培訓(xùn)標(biāo)準(zhǔn)教案
- 寫贈予房產(chǎn)合同范例
- 普通地質(zhì)學(xué)教材
- 《工業(yè)控制網(wǎng)絡(luò)及組態(tài)技術(shù)》教案
- 腸道壁增厚表現(xiàn)
- 世界主要河流與湖泊(超好)
- 2021北京高三期末文言文閱讀匯編
- 護(hù)理查房-股骨頸骨折護(hù)理查房
- 新教科版六年級科學(xué)下冊教學(xué)計(jì)劃
- 物候期觀察記錄表(豎向表)
- 《西方文明史》課程教學(xué)大綱
- GB/T 23265-2009水泥混凝土和砂漿用短切玄武巖纖維
- 《中華人民共和國憲法》知識測試題
評論
0/150
提交評論