



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Spring的七種傳播行為七種傳播行為的源碼解析Spring事務(wù)七種傳播行為源碼這部分的源碼其實比較簡單,只需要著重注意以下幾點就可以當(dāng)前是否存在事務(wù)不同的傳播行為下需要的動作使用事務(wù)(新建、加入、報錯)不使用事務(wù)(掛起、報錯)publicabstractclassAbstractPlatformTransactionManagerimplementsPlatformTransactionManager,Serializable/* Thisimplementationhandlespropagationbehavior.Delegatesto* codedoGetTransaction,co
2、deisExistingTransaction* andcodedoBegin.* see#doGetTransaction* see#isExistingTransaction* see#doBegin*/OverridepublicfinalTransactionstatusgetTransaction(NullableTransactionDefinitiondefinition)throwsTransactionException/Usedefaultsifnotransactiondefinitiongiven.TransactionDefinitiondef=(definition
3、!=null?definition:TransactionDefinition.withDefaults();Objecttransaction=doGetTransaction();booleandebugEnabled=logger.isDebugEnabled();if(isExistingTransaction(transaction)/Existingtransactionfound->checkpropagationbehaviortofindouthowtobehave./事務(wù)存在,根據(jù)隔離級別進(jìn)行處理returnhandleExistingTransaction(def,
4、transaction,debugEnabled);/Checkdefinitionsettingsfornewtransaction.if(def.getTimeout()<TransactionDefinition.TIMEOUT_DEFAULT)thrownewInvalidTimeoutException("Invalidtransactiontimeout",def.getTimeout();/Noexistingtransactionfound->checkpropagationbehaviortofindouthowtoproceed./事務(wù)不存在
5、的情況下PROPAGATION_MANDATORY行為直接報錯if(def.getPropagationBehavior()=TransactionDefinition.PROPAGATION_MANDATORY)thrownewlllegalTransactionStateException("Noexistingtransactionfoundfortransactionmarkedwithpropagation'mandatory'");/以下三種傳播行為需要開啟新事務(wù)elseif(def.getPropagationBehavior()=Transa
6、ctionDefinition.PROPAGATION_REQUIRED|def.getPropagationBehavior()=TransactionDefinition.PROPAGATION_REQUIRES_NEW|def.getPropagationBehavior()=TransactionDefinition.PROPAGATION_NESTED)SuspendedResourcesHoldersuspendedResources=suspend(null);if(debugEnabled)logger.debug("Creatingnewtransactionwit
7、hname"+def.getName()+":"+def);trybooleannewSynchronization=(getTransactionSynchronization()!=SYNCHRONIZATION_NEVER);DefaultTransactionStatusstatus=newTransactionStatus(DefaultTransactionStatusstatus=newTransactionStatus(def,transaction,true,newSynchronization,debugEnabled,suspendedRes
8、ources);doBegin(transaction,def);prepareSynchronization(status,def);returnstatus;catch(RuntimeException|Errorex)resume(null,suspendedResources);throwex;else/Create"empty"transaction:noactualtransaction,butpotentiallysynchronization.if(def.getIsolationLevel()!=TransactionDefinitionSOLATION_
9、DEFAULT&&logger.isWarnEnabled()logger.warn("Customisolationlevelspecifiedbutnoactualtransactioninitiated;"+"isolationlevelwilleffectivelybeignored:"+def);booleannewSynchronization=(getTransactionSynchronization()=SYNCHRONIZATION_ALWAYS);returnprepareTransactionStatus(def,
10、null,true,newSynchronization,debugEnabled,null);/*CreateaTransactionStatusforanexistingtransaction.*已經(jīng)存在事務(wù)的情況下對不同隔離級別的處理*/privateTransactionStatushandleExistingTransaction(TransactionDefinitiondefinition,Objecttransaction,booleandebugEnabled)throwsTransactionExceptionif(definition.getPropagationBeha
11、vior()=TransactionDefinition.PROPAGATION_NEVER)thrownewIllegalTransactionStateException("Existingtransactionfoundfortransactionmarkedwithpropagation'never'");if(definition.getPropagationBehavior()=TransactionDefinition.PROPAGATION_NOT_SUPPORTED)if(debugEnabled)logger.debug("Su
12、spendingcurrenttransaction");ObjectsuspendedResources=suspend(transaction);booleannewSynchronization=(getTransactionSynchronization()=SYNCHRONIZATION_ALWAYS);returnprepareTransactionStatus(definition,null,false,newSynchronization,debugEnabled,suspendedResources);/PROPAGATION_REQUIRES_NEW,將舊的事務(wù)掛
13、起,創(chuàng)建新的status也就是新開一個事務(wù)if(definition.getPropagationBehavior()=TransactionDefinition.PROPAGATION_REQUIRES_NEW)if(debugEnabled)logger.debug("Suspendingcurrenttransaction,creatingnewtransactionwithname"+definition.getName()+"");SuspendedResourcesHoldersuspendedResources=suspend(transa
14、ction);trybooleannewSynchronization=(getTransactionSynchronization()!=SYNCHRONIZATION_NEVER);DefaultTransactionStatusstatus=newTransactionStatus(definition,transaction,true,newSynchronization,debugEnabled,suspendedResources);doBegin(transaction,definition);prepareSynchronization(status,definition);r
15、eturnstatus;catch(RuntimeException|ErrorbeginEx)resumeAfterBeginException(transaction,suspendedResources,beginEx);throwbeginEx;/PROPAGATION_NESTED,開啟新事務(wù)if(definition.getPropagationBehavior()=TransactionDefinition.PROPAGATION_NESTED)if(!isNestedTransactionAllowed()thrownewNestedTransactionNotSupporte
16、dException("Transactionmanagerdoesnotallownestedtransactionsbydefault-"+"specify'nestedTransactionAllowed'propertywithvalue'true'");if(debugEnabled)if(debugEnabled)logger.debug("Creatingnestedtransactionwithname"+definition.getName()+"");if(use
17、SavepointForNestedTransaction()/CreatesavepointwithinexistingSpring-managedtransaction,/throughtheSavepointManagerAPIimplementedbyTransactionStatus./UsuallyusesJDBC3.0savepoints.NeveractivatesSpringsynchronization.DefaultTransactionStatusstatus=prepareTransactionStatus(definition,transaction,false,f
18、alse,debugEnabled,null);status.createAndHoldSavepoint();returnstatus;else/Nestedtransactionthroughnestedbeginandcommit/rollbackcalls./UsuallyonlyforJTA:Springsynchronizationmightgetactivatedhere/incaseofapre-existingJTAtransaction.booleannewSynchronization=(getTransactionSynchronization()!=SYNCHRONI
19、ZATION_NEVER);DefaultTransactionStatusstatus=newTransactionStatus(definition,transaction,true,newSynchronization,debugEnabled,null);doBegin(transaction,definition);prepareSynchronization(status,definition);returnstatus;/AssumablyPROPAGATION_SUPPORTSorPROPAGATION_REQUIRED.if(debugEnabled)logger.debug
20、("Participatinginexistingtransaction");if(isValidateExistingTransaction()if(definition.getIsolationLevel()!=TransactionDefinition.ISOLATION_DEFAULT)IntegercurrentIsolationLevel=TransactionSynchronizationManager.getCurrentTransactionlsolationLevel();if(currentIsolationLevel=null|currentIsolationLevel!=definition.getIsolationLevel()ConstantsisoConstants=DefaultTransactionDefinition.constants;thrownewIllegalTransactionStateException("Participatingtransactionwith
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 整車制造綠色環(huán)保技術(shù)應(yīng)用考核試卷
- 木材采伐作業(yè)成本控制考核試卷
- 衛(wèi)生材料的社會影響與企業(yè)責(zé)任考核試卷
- 在建工地安全課件模板
- 工廠院內(nèi)改造合同范本
- 公司聘用合同范本6
- 土地小院出租合同范本
- 團(tuán)隊合作合同范本
- 鋁廠服裝租借合同范本
- 小學(xué)生注意力課件
- 《調(diào)整心態(tài)迎接中考》主題班會
- 冠心病患者運動恐懼的現(xiàn)狀及影響因素分析
- 全國2018年10月自考00043經(jīng)濟(jì)法概論(財經(jīng)類)試題及答案
- 《又見平遙》課件
- 噴涂設(shè)備點檢表
- 廣東省佛山市《綜合基礎(chǔ)知識》事業(yè)單位國考真題
- 02 第2章 城市與城市化-城市管理學(xué)
- 六年級上冊英語教案-Culture 2 Going Green 第二課時 廣東開心英語
- 警察叔叔是怎樣破案的演示文稿課件
- 2019石景山初三一模語文試題及答案
- 09式 新擒敵拳 教學(xué)教案 教學(xué)法 圖解
評論
0/150
提交評論