Spring中propagation的傳播機(jī)制詳解
事務(wù)傳播機(jī)制-propagation
要搞懂事務(wù)的傳播機(jī)制,那么就要明白邏輯事務(wù)中各個(gè)事務(wù)的關(guān)系,才能徹底理解事務(wù)傳播特性。
物理事務(wù)與邏輯事務(wù)
事務(wù)性資源實(shí)際打開的事務(wù)就是物理事務(wù),如數(shù)據(jù)庫(kù)事務(wù)。
而Spring會(huì)為每個(gè)@Transactional注解的方法創(chuàng)建一個(gè)事務(wù)范圍,這種事務(wù)無法影響數(shù)據(jù)庫(kù)事務(wù)的實(shí)現(xiàn),因此可以理解為邏輯事務(wù)。
在Spring事務(wù)中,各個(gè)邏輯事務(wù)的關(guān)系可以是并列、覆蓋或包含。
對(duì)于并排:并發(fā)情況下,多個(gè)線程相互執(zhí)行自己的事務(wù),互不影響(單指事務(wù)異?;貪L,不涉及事務(wù)隔離)。 . 對(duì)于覆蓋:是指層層嵌套的方法共用同一個(gè)事務(wù),事務(wù)的屬性由最外圍方法的屬性值決定。這些方法要么同時(shí)執(zhí)行成功要么同時(shí)回滾。 . 對(duì)于包含:大范圍的事務(wù)稱為外圍事務(wù),小范圍的事務(wù)稱為內(nèi)部事務(wù),外圍事務(wù)可以包含內(nèi)部事務(wù)。他們?cè)谶壿嬌鲜腔ハ嗒?dú)立的。每個(gè)內(nèi)部事務(wù),都能獨(dú)立設(shè)置如read-only等屬性,而不影響外圍事務(wù)。
如何處理邏輯事務(wù)內(nèi)部以及與物理事務(wù)之間的關(guān)聯(lián)關(guān)系,就是傳播特性解決的問題。
事務(wù)的傳播類型
REQUIRED
Spring默認(rèn)的事務(wù)傳播機(jī)制。支持當(dāng)前事務(wù);如果不存在事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。
參與到一個(gè)已存在的更大范圍的外圍事務(wù)中,如果沒有外圍事務(wù),就打開一個(gè)新事務(wù)用于當(dāng)前范圍。在相同的線程中,這是一種很好的事務(wù)安排方式。
注:一個(gè)參與到外圍事務(wù)的事務(wù),會(huì)使用外圍事務(wù)的特性,安靜地忽略掉自己的隔離級(jí)別,超時(shí)值,只讀標(biāo)識(shí)等設(shè)置。
當(dāng)然可以在事務(wù)管理器上設(shè)置validateExistingTransactions標(biāo)識(shí)為true,這樣當(dāng)你自己的事務(wù)和參與到的外圍事務(wù)設(shè)置不一樣時(shí)會(huì)被拒絕。
REQUIRES_NEW
創(chuàng)建一個(gè)新事務(wù),如果當(dāng)前存在事務(wù),則暫停當(dāng)前事務(wù)。
與REQUIRED相比,總是使用一個(gè)獨(dú)立的事務(wù)用于當(dāng)前的邏輯事務(wù),從來不參與到一個(gè)已存在的外圍事務(wù)范圍。
這樣安排的話,底層的事務(wù)資源是不同的,因此,可以獨(dú)立地提交或回滾。外圍事務(wù)不會(huì)被內(nèi)部事務(wù)的回滾狀態(tài)影響。
這樣一個(gè)獨(dú)立的內(nèi)部事務(wù)可以聲明自己的隔離級(jí)別,超時(shí)時(shí)間和只讀設(shè)置,并不繼承外圍事務(wù)的特性,也不會(huì)被外圍事務(wù)覆蓋。
與NOT_SUPPORTED類似,我們需要JTATransactionManager來實(shí)現(xiàn)實(shí)際的事務(wù)暫停。
MANDATORY(強(qiáng)制的)
僅支持當(dāng)前事務(wù);如果當(dāng)前事務(wù)不存在,則拋出異常。
NESTED(嵌套)
如果存在當(dāng)前事務(wù),則在該事務(wù)種嵌套執(zhí)行。同時(shí)將在這段邏輯事務(wù)開始處標(biāo)記一個(gè)保存點(diǎn),當(dāng)這個(gè)邏輯事務(wù)拋出異?;貪L時(shí),那么事務(wù)將跳轉(zhuǎn)到保存點(diǎn),從而不影響嵌套事務(wù)的外部。 當(dāng)前事務(wù)不存在時(shí),同REQUIRED。
當(dāng)事務(wù)存在時(shí),使用同一個(gè)事務(wù),該事務(wù)可能會(huì)帶有多個(gè)保存點(diǎn),回滾到這些保存點(diǎn)從而不會(huì)影響整個(gè)事務(wù)??梢哉J(rèn)為是部分回滾,這樣一個(gè)內(nèi)部事務(wù)范圍觸發(fā)了一個(gè)回滾,外圍事務(wù)能夠繼續(xù)這個(gè)物理事務(wù),盡管有一些操作已經(jīng)被回滾。
DataSourceTransactionManager支持這種開箱即用的傳播。
JTATransactionManager的一些實(shí)現(xiàn)也可能支持這一點(diǎn)。不過JpaTransactionManager僅支持JDBC連接的NESTED, 如果我們將nestedTransactionAllowed標(biāo)志設(shè)置為true,且JDBC驅(qū)動(dòng)程序支持保存點(diǎn),它也適用于JPA事務(wù)中的JDBC訪問代碼。
NEVER
非事務(wù)執(zhí)行,如果存在事務(wù),則拋出異常。
SUPPORTS
支持當(dāng)前事務(wù),如果不存在則以非事務(wù)方式執(zhí)行。
NOT_SUPPORTED
以非事務(wù)方式執(zhí)行,如果當(dāng)前事務(wù)存在,則掛起當(dāng)前事務(wù)。
JTATransactionManager開箱即用地支持真正的事務(wù)暫停。其他人通過持有對(duì)現(xiàn)有的引用然后從線程上下文中清除它來模擬暫停
TIMEOUT_DEFAULT
使用默認(rèn)超時(shí)的底層事務(wù)系統(tǒng),或者如果不支持超時(shí)則沒有。
到此這篇關(guān)于Spring中propagation的傳播機(jī)制詳解的文章就介紹到這了,更多相關(guān)propagation傳播機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot前后臺(tái)數(shù)據(jù)交互的示例代碼
這篇文章主要介紹了springboot前后臺(tái)數(shù)據(jù)交互的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10Spring?Boot最經(jīng)典的20道面試題你都會(huì)了嗎
Spring Boot是現(xiàn)代化的Java應(yīng)用程序開發(fā)框架,具有高度的靈活性和可擴(kuò)展性,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot最經(jīng)典的20道面試題,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06Win10系統(tǒng)下配置java環(huán)境變量的全過程
這篇文章主要給大家介紹了關(guān)于Win10系統(tǒng)下配置java環(huán)境變量的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Spring原生Rpc六種的正確打開方式實(shí)現(xiàn)示例
這篇文章主要為大家展示了Spring原生Rpc六種的正確打開方式實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步早日升職加薪2022-02-02Ajax 驗(yàn)證用戶輸入的驗(yàn)證碼是否與隨機(jī)生成的一致
本文主要介紹了后臺(tái)驗(yàn)證用戶輸入的驗(yàn)證碼是否與隨機(jī)生成的驗(yàn)證碼一致的方法,具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02