五大事務隔離級別
- DEFAULT 使用數據庫設置的隔離級別 ( 默認 ) ,由 DBA 默認的設置來決定隔離級別 .
- READ_UNCOMMITTED 不可提交讀,會出現髒讀、不可重複讀、幻讀 ( 隔離級別最低,併發性能高 )
- READ_COMMITTED 提交讀,會出現不可重複讀、幻讀問題(鎖定正在讀取的行)
- REPEATABLE_READ可重複讀,會出現幻讀問題
- SERIALIZABLE 串行化讀,把整個表鎖住
七大事務傳播行爲
傳播行爲是針對方法而言的,假如有2個方法,他們對執行的事務要求不同,那麼該如何處理這兩者之間的事物關係
public void methodA(){
methodB();
}
public void methodB(){
}
- PROPAGATION_REQUIRED
要求當前方法一定要在事務的環境下執行,如上,執行methodB時,如果在methodA當前環境下已經開啓了事務,那麼就在當前事務環境下運行,如果當前不存在事務,則新建一個事務 - PROPAGATION_SUPPORT
當前方法支持在事務環境下運行。如果有事務,則在事務下運行,如果沒有事務,則在非事務環境下運行。 - PROPAGATION_MANDATORY
是一個比較懶的做法,如果當前環境有事務,則在事務環境下運行,如果當前不存在事務,那麼直接拋出異常(脾氣真大)。這樣的意義在於讓方法無法獨立運行,必須依賴於外部事務環境,這樣如果methodA或者methodB運行存在錯誤,則會直接rollback,放棄所有修改。 - PROPAGATION_REQUIRES_NEW
是一個很勤快的做法,無論當前是否已經存在事務,他都會自行創建事務。也就是說,如果當前環境不存在事務,則自行創建事務,如果當前已經存在了事務,那麼將當前事務掛起,然後再新建自己的事務運行。這樣的意義在於,以methodB爲例,如果methodB運行時錯誤,那麼只會導致methodB回滾,而不會導致methodA回滾,這裏實際上就是把methodA與methodB看成 了一種平級的而非調用的關係 - PROPAGATION_NOT_SUPPORTED
總是在非事務的環境下運行,如果當前環境存在事務,那麼將當前事務掛起。 - PROPAGATION_NEVER
不支持在事務的環境下運行,如果當前環境存在事務,那麼直接拋出異常。 - PROPAGATION_NESTED
如果 環境存在事務,則以 REQUIRE 的方式運行,否則以嵌入的方式,運行方法。他的意義在於,如果methodA運行methodB,methodB中拋出異常,不會導致methodA回滾,二methodA中拋出異常,會導致整個methodA與methodB都回滾。
參考 https://blog.csdn.net/weixin_39625809/article/details/80707695