您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關spring中事務傳播行為有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
spring 的七中傳播行為
PROPAGATION_REQUIRED
標識當前方法必須在事務中執行
PROPAGATION_SUPPORTS
如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。
PROPAGATION_MANDATORY
如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
PROPAGATION_REQUIRES_NEW
使用PROPAGATION_REQUIRES_NEW,需要使用 JtaTransactionManager作為事務管理器。 它會開啟一個新的事務。如果一個事務已經存在,則先將這個存在的事務掛起。
PROPAGATION_NOT_SUPPORTED
PROPAGATION_NOT_SUPPORTED 總是非事務地執行,并掛起任何存在的事務。
PROPAGATION_NEVER
總是非事務地執行,如果存在一個活動事務,則拋出異常。
PROPAGATION_NESTED
如果一個活動的事務存在,則運行在一個嵌套的事務中。 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { methodB(); // do something } @Transactional(propagation = Propagation.REQUIRED) public void methodB() { // do something }
(1)調用methodB,因為當前上下文中沒有事務,所以會新建一個事務。
(2)調用methodA,因為當前上下文中沒有事務,所以會新建一個事務。但是,當執行到methodB時,方法B會被加入到methodA的事務中。
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { methodB(); // do something } // 事務屬性為SUPPORTS @Transactional(propagation = Propagation.SUPPORTS) public void methodB() { // do something }
(1) 調用methodB,則以非事務的方法執行。
(2) 調用methodA,上下文沒有事務,新建一個,而執行到methodB時,它自動加入到methodA的事務中。
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { methodB(); // do something } // 事務屬性為MANDATORY @Transactional(propagation = Propagation.MANDATORY) public void methodB() { // do something
(1) 調用methodB時,上下文中沒有事務,則會拋出異常。
(2) 調用methodA,上下文沒有事務,新建一個,而執行到methodB時,它自動加入到methodA的事務中。
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { doSomeThingA(); methodB(); doSomeThingB(); // do something else } // 事務屬性為REQUIRES_NEW @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodB() { // do something }
(1) 調用methodB會開啟一個新的事務。
(2) 調用methodA時,methodA會開啟事務,methodB也會開啟一個新的事務,但是這兩個事務互相獨立。也就是說,如果methodA方法在調用methodB方法后的doSomeThingB方法失敗了,而methodB方法所做的結果依然被提交。而除了 methodB之外的其它代碼導致的結果卻被回滾了
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { doSomeThingA(); methodB(); doSomeThingB(); // do something else } // 事務屬性為PROPAGATION_NOT_SUPPORTED @Transactional(propagation = Propagation.PROPAGATION_NOT_SUPPORTED) public void methodB() { // do something }
(1) 執行methodB。無事務。
(2) 執行methodA。當執行到方法B時,事務會被掛起,以非事務的方式執行methodB,然后事務恢復。
也就是methodB中有異常時,B不回滾,A回滾。
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { methodB(); // do something } // 事務屬性為SUPPORTS @Transactional(propagation = Propagation.SUPPORTS) public void methodB() { // do something }
(1) 單獨執行methodB, 非事務執行。
(2) 執行 methodA ,當執行到methodB時,會拋出異常。
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { doSomeThingA(); methodB(); doSomeThingB(); // do something } // 事務屬性為NEWSTED @Transactional(propagation = Propagation.NEWSTED) public void methodB() { // do something }
(1)單獨執行methodB,則會開啟一個事務。
(2)執行methodA,如果methodA的事務執行失敗后,會回滾內部的methodB事務。但是,methodB事務執行失敗后,并不會引起外層methodA事務的回滾。
感謝各位的閱讀!關于“spring中事務傳播行為有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。