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

