Spring事務隔離與傳播機制

五大事務隔離級別

  1. DEFAULT 使用數據庫設置的隔離級別 ( 默認 ) ,由 DBA 默認的設置來決定隔離級別 .
  2. READ_UNCOMMITTED 不可提交讀,會出現髒讀、不可重複讀、幻讀 ( 隔離級別最低,併發性能高 )
  3. READ_COMMITTED 提交讀,會出現不可重複讀、幻讀問題(鎖定正在讀取的行)
  4. REPEATABLE_READ可重複讀,會出現幻讀問題
  5. SERIALIZABLE 串行化讀,把整個表鎖住

七大事務傳播行爲

傳播行爲是針對方法而言的,假如有2個方法,他們對執行的事務要求不同,那麼該如何處理這兩者之間的事物關係

public void methodA(){
      methodB();
}

public void methodB(){
}
  1. PROPAGATION_REQUIRED
    要求當前方法一定要在事務的環境下執行,如上,執行methodB時,如果在methodA當前環境下已經開啓了事務,那麼就在當前事務環境下運行,如果當前不存在事務,則新建一個事務
  2. PROPAGATION_SUPPORT
    當前方法支持在事務環境下運行。如果有事務,則在事務下運行,如果沒有事務,則在非事務環境下運行。
  3. PROPAGATION_MANDATORY
    是一個比較懶的做法,如果當前環境有事務,則在事務環境下運行,如果當前不存在事務,那麼直接拋出異常(脾氣真大)。這樣的意義在於讓方法無法獨立運行,必須依賴於外部事務環境,這樣如果methodA或者methodB運行存在錯誤,則會直接rollback,放棄所有修改。
  4. PROPAGATION_REQUIRES_NEW
    是一個很勤快的做法,無論當前是否已經存在事務,他都會自行創建事務。也就是說,如果當前環境不存在事務,則自行創建事務,如果當前已經存在了事務,那麼將當前事務掛起,然後再新建自己的事務運行。這樣的意義在於,以methodB爲例,如果methodB運行時錯誤,那麼只會導致methodB回滾,而不會導致methodA回滾,這裏實際上就是把methodA與methodB看成 了一種平級的而非調用的關係
  5. PROPAGATION_NOT_SUPPORTED
    總是在非事務的環境下運行,如果當前環境存在事務,那麼將當前事務掛起。
  6. PROPAGATION_NEVER
    不支持在事務的環境下運行,如果當前環境存在事務,那麼直接拋出異常。
  7. PROPAGATION_NESTED
    如果 環境存在事務,則以 REQUIRE 的方式運行,否則以嵌入的方式,運行方法。他的意義在於,如果methodA運行methodB,methodB中拋出異常,不會導致methodA回滾,二methodA中拋出異常,會導致整個methodA與methodB都回滾。

參考 https://blog.csdn.net/weixin_39625809/article/details/80707695

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章