1. 程式人生 > >spring巢狀事物

spring巢狀事物

一、事務傳播屬性
REQUIRED:業務方法需要在一個事務中執行。如果方法執行時,已經處在一個事務中,那麼這個時候就會加入到該事務中,如果當前沒有事務環境的話,就會為自己建立一個新的事務。預設情況下,業務方法的事務傳播屬性就是REQUIRED。在應用開發中,80%的情況下都會使用這種事務傳播屬性。

NOT_SUPPORTED:宣告方法不需要事務。如果方法沒有關聯到一個事務,容器不會為它開啟事務。如果方法在一個事務中被呼叫(在其他業務bean的方法中被呼叫了,而其他業務bean的方法是開啟了事務的),該事務會被掛起,在方法呼叫結束後,原先的事務便會恢復執行。
REQUIRESNEW:該屬性表明不管當前是否存在事務,業務方法總會為自己發起一個新的事務。如果方法已經執行在一個事務中,則原有事務會被掛起,新的事務會被建立,直到方法執行結束,新事務才算結束,原先的事務才會恢復執行。

MANDATORY:該屬性指定業務方法只能在一個已經存在的事務中執行,業務方法不能發起自己的事務。如果業務方法在沒有事務的環境下呼叫,容器就會丟擲異常。

SUPPORTS:這一事務屬性表明,如果業務方法在某個事務範圍內被呼叫,則方法成為該事務的一部分。如果業務方法在事務範圍外被呼叫,則方法在沒有事務的環境下執行。即當標註了事務傳播屬性——SUPPORTS的業務方法在另一個bean的業務方法中執行時,如果另一個bean的業務方法開啟了事務,那麼執行到標註了事務傳播屬性——SUPPORTS的業務方法時,它就會處在事務中執行,如果另一個bean的業務方法也沒開啟事務,那麼標註了事務傳播屬性——SUPPORTS的業務方法也在沒有事務的環境中進行。

Never:指定業務方法絕對不能在事務範圍內執行。如果業務方法在某個事務中執行,容器會丟擲異常,只有業務方法沒有關聯到任何事務,才能正常執行。

NESTED:如果一個活動的事務存在,則當前方法執行在一個巢狀的事務中。 如果沒有活動事務,則按REQUIRED屬性執行。它使用了一個單獨的事務,這個事務擁有多個可以回滾的儲存點。內部事務的回滾不會對外部事務造成影響。它只對DataSourceTransactionManager事務管理器起效果。

二、巢狀事物總結
事物成功總結

1、內外都無try Catch的時候,外部異常,全部回滾。

2、內外都無try Catch的時候,內部異常,全部回滾。

3、外部有try Catch時候,內部異常,全部回滾

4、內部有try Catch,外部異常,全部回滾

5、友情提示:外層方法中調取其他介面,或者另外開啟執行緒的操作,一定放到最後!!!(因為調取介面不能回滾,一定要最後來處理)

總結:由於上面的異常被捕獲導致,很多事務回滾失敗。如果一定要將捕獲,請捕獲後又丟擲RuntimeException(預設為異常捕獲RuntimeException)。

三、本人遇到的一個問題
一個service 中的 c(有事物)方法裡面包含 a和b方法,前提是 a和b方法都是別的service的方法, a沒有事物,b有事物。同時 a方法中又呼叫了b。然後 他們的事物到底是怎麼執行的?
答案:正常的先c事物後b事物,不過b要加上獨立事物(REQUIRES_NEW)。
回不回滾看的是你的異常,有沒有穿過,被註解的方法往上拋!如果b裡的異常出來,你抓掉了,不拋到c外面。
並且同類this.呼叫相當於調的沒註解方法!