public interface TransactionDefinition { // 返回事務的傳播行爲 default int getPropagationBehavior() { return PROPAGATION_REQUIRED; } // 返回事務的隔離級別,事務管理器根據它來控制另一個事務能夠看到本事務內的哪些數據 default int getIsolationLevel() { return ISOLATION_DEFAULT; } // 返回事務必須在多少秒內完成 default int getTimeout() { return TIMEOUT_DEFAULT; }; // 事務是否只讀,事務管理器可以根據這個返回值進行優化 default boolean isReadOnly() { return false; } }
事務的第一個方面是傳播行爲(propagation behavior)。當事務方法被另外一個事務方法調用時,必須指定事務應該如何傳播。例如:方法可能繼續在現有事務中運行,也可能開啓一個新事務,並在本身的事務中運行。Spring定義了七種傳播行爲java
傳播行爲
|
含義
|
PROPAGATION_REQUIRED
|
表示當前方法必須運行在事務中。若是當前事務存在,方法將會在該事務中運行。不然,會啓動一個新的事務
|
PROPAGATION_SUPPORTS
|
表示當前方法不須要事務上下文,可是若是存在當前事務的話,那麼該方法會在這個事務中運行
|
PROPAGATION_MANDATORY
|
表示該方法必須在事務中運行,若是當前事務不存在,則會拋出一個異常
|
PROPAGATION_REQUIRED_NEW
|
表示當前方法必須運行在它本身的事務中。一個新的事務將被啓動。若是存在當前事務,在該方法執行期間,當前事務會被掛起。
|
PROPAGATION_NOT_SUPPORTED
|
表示該方法不該該運行在事務中。若是存在當前事務,在該方法運行期間,當前事務將被掛起。
|
PROPAGATION_NEVER
|
表示當前方法不該該運行在事務上下文中。若是當前正有一個事務在運行,則會拋出異常
|
PROPAGATION_NESTED
|
表示若是當前已經存在一個事務,那麼該方法將會在嵌套事務中運行。嵌套的事務能夠獨立於當前事務進行單獨地提交或回滾。若是當前事務不存在,那麼其行爲與PROPAGATION_REQUIRED同樣。注意各廠商對這種傳播行爲的支持是有所差別的。能夠參考資源管理器的文檔來確認它們是否支持嵌套事務
|
事務的隔離級別定義一個事務可能受其餘併發務活動活動影響的程度。數據庫
隔離級別
|
含義
|
ISOLATION_DEFAULT
|
使用後端數據庫默認的隔離級別
|
ISOLATION_READ_UNCOMMITTED
|
最低的隔離級別,容許讀取還沒有提交的數據變動,可能會致使髒讀、幻讀或不可重複讀
|
ISOLATION_READ_COMMITTED
|
容許讀取併發事務已經提交的數據,能夠阻止髒讀,可是幻讀或不可重複讀仍有可能發生
|
ISOLATION_REPEATABLE_READ
|
對同一字段的屢次讀取結果都是一致的,除非數據是被自己事務本身所修改,能夠阻止髒讀和不可重複讀,但幻讀仍有可能發生
|
ISOLATION_SERIALIZABLE
|
最高的隔離級別,徹底服從ACID的隔離級別,確保阻止髒讀、不可重複讀以及幻讀,也是最慢的事務隔離級別,由於它一般是經過徹底鎖定事務相關的數據庫表來實現的
|
默認狀況下,事務只有遇到運行期異常時纔會回滾,而在遇到檢查型異常時不會回滾(這一行爲與EJB的回滾行爲是一致的可是你能夠聲明事務在遇到特定的檢查型異常時像遇到運行期異常那樣回滾。一樣,你還能夠聲明事務遇到特定的異常不回滾,即便這些異常是運行期異常。後端