您好,登錄后才能下訂單哦!
這篇文章主要講解了“Spring中事務(wù)的傳播行為說明以及怎么對(duì)事務(wù)進(jìn)行管理”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Spring中事務(wù)的傳播行為說明以及怎么對(duì)事務(wù)進(jìn)行管理”吧!
當(dāng)我們?cè)趕pring中調(diào)用Service中一個(gè)方法時(shí),如果我們默認(rèn)配置了對(duì)Service的事務(wù)管理,那么此時(shí)的Service將運(yùn)行在一個(gè)由spring管理的事務(wù)環(huán)境中。由于在我們?nèi)粘5拈_發(fā)時(shí),通常會(huì)在一個(gè)Service接口中調(diào)用其它Service中的接口以此來完成一個(gè)完整的事務(wù)操作,這時(shí)就會(huì)發(fā)生服務(wù)接口嵌套調(diào)用的情況,spring通過事務(wù)傳播行為控制當(dāng)前事務(wù)如何傳播到被嵌套調(diào)用的目標(biāo)服務(wù)接口方法中的。下面我們想想了解一下在spring中都有哪些不同的事務(wù)傳播行為,以前它們的區(qū)別。
spring在TransactionDefinition接口中定義了7種類型的事務(wù)傳播行為,它們具體的區(qū)別如下:
事務(wù)傳播行為說明
PROPAGATION_REQUIRED:如果當(dāng)前沒有事務(wù),那就新建一個(gè)新的事務(wù),如果已經(jīng)存在一個(gè)事務(wù),那就加入到這個(gè)事務(wù)中。
PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方法執(zhí)行。
PROPAGATION_MANDATORY:使用當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),則就拋出異常。
PROPAGATION_REQUIRES_NEW:新建事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常
PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行,如果當(dāng)前沒有事務(wù),則執(zhí)行與PROPAGATION_REQUIRED類似的操作。
備注:當(dāng)使有PROPAGATION_NESTED時(shí),底層的數(shù)據(jù)源必須基于JDBC3.0,并且實(shí)現(xiàn)者需要支持保存點(diǎn)事務(wù)機(jī)制。
我們?cè)趯?shí)際開發(fā)時(shí),基本不會(huì)通過編碼的方式來進(jìn)行事務(wù)管理,因?yàn)檫@樣很不方便管理,在實(shí)際的開發(fā)中我們一般會(huì)采用xml的方法或者注解的方法來進(jìn)行事務(wù)管理。雖然我們不會(huì)直接采用編碼的方法進(jìn)行事務(wù)管理,但在spring中還是提供了對(duì)該方法的支持。我們可以直接使用spring為我們提供的TransactionTemplate模板類來執(zhí)行我們用編碼的方式對(duì)事務(wù)進(jìn)行管理。下面我們簡(jiǎn)單了解一下TransactionTemplate模板類的主要方法。
下面我們通過一個(gè)簡(jiǎn)單的測(cè)試用例來看一下到底怎么用ransactionTemplate模板類通過編碼的方法進(jìn)行事務(wù)管理。
由于spring事務(wù)管理器TransactionSynchronizationManager進(jìn)行工作,所以如果在回調(diào)接口方法中需要顯示的訪問數(shù)據(jù)庫連接,必須通過資源獲取工具類得到線程綁定的數(shù)據(jù)連接,因?yàn)檫@是spring事務(wù)管理的底層協(xié)議。如果DAO接口是基于spring提供的模板類創(chuàng)建的,由于模板類已經(jīng)在內(nèi)部使用了資源獲取工具類獲取數(shù)據(jù)庫連接,所以用戶就不必關(guān)心底層數(shù)據(jù)連接的獲取問題了。
上面我們提到過,在我們?nèi)粘i_發(fā)時(shí),不是會(huì)采用用編碼的方式管理事務(wù)的,我們基本上會(huì)采用聲明式事務(wù)管理功能,因?yàn)檫@種方式可以讓事務(wù)管理代碼完全從業(yè)務(wù)代碼中解耦。在spring中聲明式事務(wù)管理是通過spring AOP的功能實(shí)現(xiàn)的。具體的流程是通過事務(wù)的聲明信息,spring負(fù)責(zé)將事務(wù)管理增強(qiáng)邏輯動(dòng)態(tài)織入到業(yè)務(wù)方法的相應(yīng)連接點(diǎn)中。下面我們通過xml代碼的方法來管理事務(wù)。
UserDao接口中有兩個(gè)方法,我們可以對(duì)對(duì)save方法添加寫的事務(wù)能力,而對(duì)getUserInfo方法添加讀事務(wù)能力。
我們可以看到,采用xml管理事務(wù)和直接用編碼的方法有很大的不同的,在接口的實(shí)現(xiàn)類中只有相關(guān)的業(yè)務(wù)代碼,并不會(huì)有任何相關(guān)事務(wù)的代碼,而用直接編碼的方法則必須手動(dòng)的將管理事務(wù)的代碼編寫在接口的實(shí)現(xiàn)類中。在spring中可以用兩種方式來通過xml管理事務(wù),一種方式是TransactionProxyFactoryBean的方式來進(jìn)行事務(wù)管理,還有一種方式是通過tx的方式來管理事務(wù),因?yàn)門ransactionProxyFactoryBean的方式spring官網(wǎng)中已經(jīng)不推薦使用了,所以,我們下面的測(cè)試用例將采用用tx的方式來管理事務(wù)。
感謝各位的閱讀,以上就是“Spring中事務(wù)的傳播行為說明以及怎么對(duì)事務(wù)進(jìn)行管理”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Spring中事務(wù)的傳播行為說明以及怎么對(duì)事務(wù)進(jìn)行管理這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。