事務的隔離級別和傳播級別有何區別

事務的隔離級別

事務的隔離級別源於事務ACID的I(Isolation),即多個事務同時操做同一實體時,其中一個事務的讀寫操做對其餘事務及其自身的可見性影響程度。具體能夠分爲以下幾個等級:數據庫

  • 讀未提交
    某個事務未提交前,其修改的數據對其餘事務可見,這種隔離級別最低,除了確保執行事務自己的原子性,對其餘事務幾乎無隔離,因此若是源事務回滾,其餘事務就會出現髒讀現象。安全

  • 讀已提交
    一個事務針對數據的寫操做,只有提交以後,其餘事務纔可見。這是相對靠譜的方案。也是不少數據庫的默認隔離級別。讀提交也存在兩個主要的問題,第一種是,若是兩個事務同時開啓,其中一個事務第一次讀取,和在另外一個事務修改並提交後讀取到的數據會不一致,也就是不可重複讀;第二個問題是,容易引發死鎖。ide

  • 可重複讀
    一個事務針對數據的讀操做一旦開始,其餘事務再也不能夠進行寫操做,至關於讀鎖。可重複讀增長了數據的安全性,可是針對新增操做,依然存在幻讀問題。事務

  • 串行化
    串行化是安全性最高的一種隔離界別,也是用的最少的一種隔離級別,事務串行化執行,吞吐量嚴重受限。

事務的傳播級別

和事務的隔離級別不一樣,傳播特性是指一個事務開啓後,若是在事務內涉及到其餘事務的調用,是沿用主事務,仍是開啓新事務,亦或是,不接受事務。內存

  • REQUIRED 若是存在一個事務,支持當前事務。若是沒有則開啓一個新的事務。
  • SUPPORTS 若是存在一個事務,支持當前事務。若是沒有則按照非事務的執行。
  • MANDATORY 若是已經存在一個事務,支持當前事務。若是沒有則拋出異常。
  • REQUIRES_NEW 老是開啓一個新的事務。若是一個事務已經存在,則將這個存在的事務掛起。
  • NOT_SUPPORTED 老是按照非事務地執行,並掛起任何存在的事務。
  • NEVER 老是按照非事務方式執行,若是存在一個活動事務則拋出異常
  • NESTED 若是一個活動的事務存在,則運行在一個嵌套的事務中. 若是沒有活動事務, 則按REQUIRED 屬性執行。

NESTED傳播級別時,若是外層事務不可回滾內存提交的事務。it

相關文章
相關標籤/搜索