spring 事務隔離級別、事務的傳播機制

隔離級別

隔離級別是指若干個併發的事務之間的隔離程度,與咱們開發時候主要相關的場景包括:髒讀取、重複讀、幻讀。spring

咱們能夠看org.springframework.transaction.annotation.Isolation枚舉類中定義了五個表示隔離級別的值:數據庫

public enum Isolation {
    DEFAULT(-1),
    READ_UNCOMMITTED(1),
    READ_COMMITTED(2),
    REPEATABLE_READ(4),
    SERIALIZABLE(8);
}
  • DEFAULT:這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,一般這值就是:READ_COMMITTED
  • READ_UNCOMMITTED:該隔離級別表示一個事務能夠讀取另外一個事務修改但尚未提交的數據。該級別不能防止髒讀和不可重複讀,所以不多使用該隔離級別。
  • READ_COMMITTED:該隔離級別表示一個事務只能讀取另外一個事務已經提交的數據。該級別能夠防止髒讀,這也是大多數狀況下的推薦值。
  • REPEATABLE_READ:該隔離級別表示一個事務在整個過程當中能夠屢次重複執行某個查詢,而且每次返回的記錄都相同。即便在屢次查詢之間有新增的數據知足該查詢,這些新增的記錄也會被忽略。該級別能夠防止髒讀和不可重複讀。
  • SERIALIZABLE:全部的事務依次逐個執行,這樣事務之間就徹底不可能產生干擾,也就是說,該級別能夠防止髒讀、不可重複讀以及幻讀。可是這將嚴重影響程序的性能。一般狀況下也不會用到該級別。

指定方法:經過使用isolation屬性設置,例如:併發

@Transactional(isolation = Isolation.DEFAULT)
  • 傳播行爲

所謂事務的傳播行爲是指,若是在開始當前事務以前,一個事務上下文已經存在,此時有若干選項能夠指定一個事務性方法的執行行爲。性能

咱們能夠看org.springframework.transaction.annotation.Propagation枚舉類中定義了6個表示傳播行爲的枚舉值:spa

public enum Propagation {
    REQUIRED(0),
    SUPPORTS(1),
    MANDATORY(2),
    REQUIRES_NEW(3),
    NOT_SUPPORTED(4),
    NEVER(5),
    NESTED(6);
}
  • REQUIRED:若是當前存在事務,則加入該事務;若是當前沒有事務,則建立一個新的事務。
  • SUPPORTS:若是當前存在事務,則加入該事務;若是當前沒有事務,則以非事務的方式繼續運行。
  • MANDATORY:若是當前存在事務,則加入該事務;若是當前沒有事務,則拋出異常。
  • REQUIRES_NEW:建立一個新的事務,若是當前存在事務,則把當前事務掛起。
  • NOT_SUPPORTED:以非事務方式運行,若是當前存在事務,則把當前事務掛起。
  • NEVER:以非事務方式運行,若是當前存在事務,則拋出異常。
  • NESTED:若是當前存在事務,則建立一個事務做爲當前事務的嵌套事務來運行;若是當前沒有事務,則該取值等價於REQUIRED。

指定方法:經過使用propagation屬性設置,例如:code

@Transactional(propagation = Propagation.REQUIRED)
相關文章
相關標籤/搜索