Spring的七種傳播行為_第1頁
Spring的七種傳播行為_第2頁
Spring的七種傳播行為_第3頁
Spring的七種傳播行為_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論