Spring事務(wù)的傳播機(jī)制使用及說(shuō)明
spring事務(wù)的傳播機(jī)制
1、spring事務(wù)
指封裝在數(shù)據(jù)庫(kù)事務(wù)之上的一種事務(wù)處理機(jī)制。其管理方法有兩種,分別是編程式事務(wù)以及聲明式事務(wù)。
一般我們使用@Transactional進(jìn)行聲明式事務(wù)。
2、Spring事務(wù)的傳播機(jī)制
事務(wù)的傳播,是指一個(gè)方法調(diào)用另一個(gè)方法并將事務(wù)傳遞給它。
事務(wù)的轉(zhuǎn)播機(jī)制主要針對(duì)被調(diào)用者而言,控制它是否被傳播或者被怎樣傳播。
spring事務(wù)的傳播機(jī)制有七種
| 傳播行為 | 描述 |
| PROPAGATION_REQUIRED | 默認(rèn)的Spring事物傳播級(jí)別,若當(dāng)前存在事務(wù),則加入該事務(wù),若不存在事務(wù),則新建一個(gè)事務(wù) |
| PROPAGATION_REQUIRE_NEW | 若當(dāng)前沒(méi)有事務(wù),則新建一個(gè)事務(wù)。若當(dāng)前存在事務(wù),則新建 一個(gè)事務(wù),新老事務(wù)相互獨(dú)立。外部事務(wù)拋出異?;貪L不會(huì)影響內(nèi)部事務(wù)的正常提交 |
| PROPAGATION_NESTED | 如果當(dāng)前存在事務(wù),則嵌套在當(dāng)前事務(wù)中執(zhí)行。如果當(dāng)前沒(méi)有事務(wù), 則新建一個(gè)事務(wù),類(lèi)似于REQUIRE_NEW |
| PROPAGATION_SUPPORTS | 支持當(dāng)前事務(wù),若當(dāng)前不存在事務(wù),以非事務(wù)的方式執(zhí)行 |
| PROPAGATION_NOT_SUPPORTED | 以非事務(wù)的方式執(zhí)行,若當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起 |
| PROPAGATION_MANDATORY | 強(qiáng)制事務(wù)執(zhí)行,若當(dāng)前不存在事務(wù),則拋出異常 |
| PROPAGATION_NEVER | 以非事務(wù)的方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常 |
傳播級(jí)別一般不需要定義,默認(rèn)就是PROPAGATION_REQUIRED,除非在嵌套事務(wù)的情況。
上述描述表格的描述還是比較抽象,下面我們使用一個(gè)例子來(lái)說(shuō)明這個(gè)傳播機(jī)制。
假定方法A調(diào)用方法B
| 方法B定義的事務(wù)類(lèi)型 | A方法有事務(wù)時(shí) | A方法無(wú)事務(wù) |
| @Transactional(propagation = Propagation.REQUIRED) | B和A事務(wù)合并成一個(gè)事務(wù) | B新建一個(gè)事務(wù) |
| @Transactional(propagation = Propagation.REQUIRES_NEW) | B新建一個(gè)事務(wù),和A事務(wù)無(wú)關(guān),互不影響 | B新建一個(gè)事務(wù) |
| @Transactional(propagation = Propagation.NESTED) | B新建一個(gè)A的子事務(wù),A異常影響B(tài),B異常不影響A | B新建一個(gè)事務(wù) |
| @Transactional(propagation = Propagation.SUPPORTS) | B加入到A事務(wù)中 | B無(wú)事務(wù) |
| @Transactional(propagation = Propagation.NOT_SUPPORTED) | 掛起A事務(wù),B以無(wú)事務(wù)方式執(zhí)行 | B無(wú)事務(wù) |
| @Transactional(propagation = Propagation.MANDATORY) | B加入到A事務(wù)中 | B拋異常 |
| @Transactional(propagation = Propagation.NEVER) | B拋異常 | B無(wú)事務(wù) |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用Freemarker頁(yè)面靜態(tài)化生成的實(shí)現(xiàn)
這篇文章主要介紹了Java使用Freemarker頁(yè)面靜態(tài)化生成的實(shí)現(xiàn),頁(yè)面靜態(tài)化是將原來(lái)的動(dòng)態(tài)網(wǎng)頁(yè)改為通過(guò)靜態(tài)化技術(shù)生成的靜態(tài)網(wǎng)頁(yè),FreeMarker?是一個(gè)用?Java?語(yǔ)言編寫(xiě)的模板引擎,它基于模板來(lái)生成文本輸,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-06-06
idea中一鍵自動(dòng)生成序列化serialVersionUID方式
這篇文章主要介紹了idea中一鍵自動(dòng)生成序列化serialVersionUID方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
java使用枚舉封裝錯(cuò)誤碼及錯(cuò)誤信息詳解
這篇文章主要介紹了java使用枚舉封裝錯(cuò)誤碼及錯(cuò)誤信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
JavaMe開(kāi)發(fā)繪制文本框TextEdit
在JavaMe連載(3)-也說(shuō)MVC設(shè)計(jì)模式 一文中提到了一個(gè)TextEdit類(lèi),但沒(méi)有給出具體實(shí)現(xiàn),TextEdit是采用GameCanvas繪制的文本編輯器。本文結(jié)合實(shí)例給出實(shí)現(xiàn)的方法。2015-09-09
Java操作集合工具類(lèi)Collections使用詳解
這篇文章主要介紹了java操作集合工具類(lèi)Collections使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
SpringMVC中@RequestMapping注解的實(shí)現(xiàn)
RequestMapping是一個(gè)用來(lái)處理請(qǐng)求地址映射的注解,本文主要介紹了SpringMVC中@RequestMapping注解的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Spring?MVC和springboot靜態(tài)資源處理問(wèn)題
這篇文章主要介紹了Spring?MVC和springboot靜態(tài)資源處理問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

