Spring事務總結

事務特性

  • 原子性(Atomicity):事務是一個原子操做,由一系列動做組成。事務的原子性確保動做要麼所有完成,要麼徹底不起做用。
  • 一致性(Consistency):一旦事務完成(無論成功仍是失敗),系統必須確保它所建模的業務處於一致的狀態,而不會是部分完成部分失敗。在現實中的數據不該該被破壞。
  • 隔離性(Isolation):可能有許多事務會同時處理相同的數據,所以每一個事務都應該與其餘事務隔離開來,防止數據損壞。
  • 持久性(Durability):一旦事務完成,不管發生什麼系統錯誤,它的結果都不該該受到影響,這樣就能從任何系統崩潰中恢復過來。一般狀況下,事務的結果被寫到持久化存儲器中

 

Spring事務管理核心接口

 

基本事務屬性定義

   

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的隔離級別,確保阻止髒讀、不可重複讀以及幻讀,也是最慢的事務隔離級別,由於它一般是經過徹底鎖定事務相關的數據庫表來實現的
  • 只讀

        若是一個事務只對數據庫執行讀操做,那麼該數據庫就可能利用那個事務的只讀特性,採起某些優化措施。經過把一個事務聲明爲只讀,能夠給後端數據庫一個機會來應用那些它認爲合適的優化措施。因爲只讀的優化措施是在一個事務啓動時由後端數據庫實施的, 所以,只有對於那些具備可能啓動一個新事務的傳播行爲(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、 ROPAGATION_NESTED)的方法來講,將事務聲明爲只讀纔有意義。
  • 事務超時

         爲了使一個應用程序很好地執行,它的事務不能運行太長時間。所以,聲明式事務的下一個特性就是它的超時。假設事務的運行時間變得格外的長,因爲事務可能涉及對數據庫的鎖定,因此長時間運行的事務會沒必要要地佔用數據庫資源。這時就能夠聲明一個事務在特定秒數後自動回滾,沒必要等它本身結束。因爲超時時鐘在一個事務啓動的時候開始的,所以,只有對於那些具備可能啓動一個新事務的傳播行爲(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、ROPAGATION_NESTED)的方法來講,聲明事務超時纔有意義。
  • 回滾規則

       默認狀況下,事務只有遇到運行期異常時纔會回滾,而在遇到檢查型異常時不會回滾(這一行爲與EJB的回滾行爲是一致的可是你能夠聲明事務在遇到特定的檢查型異常時像遇到運行期異常那樣回滾。一樣,你還能夠聲明事務遇到特定的異常不回滾,即便這些異常是運行期異常。後端

相關文章
相關標籤/搜索