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

事務的隔離級別

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

  • 讀未提交
    某個事務未提交前,其修改的數據對其他事務可見,這種隔離級別最低,除了確保執行事務本身的原子性,對其他事務幾乎無隔離,所以如果源事務回滾,其他事務就會出現髒讀現象。

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

  • 可重複讀
    一個事務針對數據的讀操作一旦開始,其他事務不再可以進行寫操作,相當於讀鎖。可重複讀增加了數據的安全性,但是針對新增操作,依然存在幻讀問題。

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

事務的傳播級別

和事務的隔離級別不同,傳播特性是指一個事務開啓後,如果在事務內涉及到其他事務的調用,是沿用主事務,還是開啓新事務,亦或是,不接受事務。

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

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

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