spring事務隔離級別和傳播機制

寫代碼這麼久以來,一直沒有很好的理解底層的東西,做爲一個不怎麼愛學習的程序猿,深怕被這個進步的社會所淘汰。於是沒辦法,最近又研究起了沒怎麼搞懂過的事務。

spring事務的隔離級別:

  1. 讀未提交(READ_UNCOMMITED):允許讀取還未提交的改變了的數據。可能導致髒讀,不可重複讀,幻讀。
  2. 讀已提交(READ_COMMITED):允許在併發事務已經提交後讀取。可防止髒讀,但不可重複讀、幻讀仍可能發生
  3. 可重複讀(REPEATABLE_READ):在同一事務中對相同字段的多次讀取是一致的,除非數據被事務本身改變。可以防止髒讀,不可重複讀,但幻讀仍然可能發生。
  4. 可串行化、序列化(SERIALIZABLE):完全服從ACID的隔離級別,確保不發生髒讀、不可重複讀、幻讀。他在所有的隔離級別中是最慢的,因爲要完全鎖住在事務中涉及到的數據表。
  5. Default:使用後端數據庫默認的隔離級別(spring中的選項,也是isolation屬性的默認值 ,Mysql默認採用REPEATABLE_READ隔離級別,Oracle默認採用READ_COMMITED隔離級別)。

專業術語解釋:

ACID事務的4個屬性:

Atomic(原子性):指整個數據庫事務是不可分割的工作單位。只有使數據庫所有的操作執行成功,纔算整個事務成功;事務中任何一個SQL語句執行失敗,那麼已經執行成功的SQL語句也必須撤銷,數據庫狀態應該退回到執行事務前的狀態

Consistency(一致性):指數據庫事務不能破壞關係數據的完整性以及業務邏輯上的一致性。例如對銀行轉賬事務,不管事務成功還是失敗,應該保證事務結束後轉賬雙方的餘額之和保持不變。轉賬之前A和B一共有2000元,轉賬之後總和還是2000元。

Isolation(隔離性):指的是在併發環境中,當不同事務同時操縱相同的數據時,每個事務都有各自的完整數據空間。

Durability(持久性):指的是隻要事務成功結束,它對數據庫所做的更新就必須永久保存下來.即使系統發生崩潰,重新啓動數據庫系統後,數據庫還能恢復到事務成功結束時的狀態.

與事務隔離級別相關的問題:

髒讀:A事務對一條記錄進行修改,尚未提交,B事務已經看到A事務的修改結果.若A事務發生回滾,B讀到的數據就是錯誤的,這就是髒讀.

不可重複讀:在事務1內,讀取了一個數據,事務1還沒有結束時,事務2 也訪問了這個數據,修改了這個數據,並提交。緊接着,事務1又讀這個數據。由於事務2的修改,那麼事務1兩次讀到的數據可能是不一樣的,因此稱爲是不可重複讀。

幻讀:A事務對所有記錄進行修改,尚未提交,此時B事務創建了一條新記錄,A、B都提交。A查看所有數據,發現有一條數據沒有被修改,因爲這是B事務新增的,就像看到了幻像一樣,這就是幻讀。(所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行InnoDB存儲引擎通過多版本併發控制(MVCC)解決了幻讀問題)。

不可重複讀和幻讀的區別:不可重複讀的重點在於update和delete,而幻讀的重點在於insert.

注意:不可重複讀和幻讀的區別是:前者是指讀到了已經提交事務的更改數據(修改或刪除),後者是讀到了其它已提交事務的新增數據。

對於這兩種問題解決採用不同的方法,防止讀到更改數據,只需對操作的數據添加行級鎖,防止操作中的數據發生變化;而防止讀到新增數據,往往需要添加錶行鎖,將整張表鎖定,防止新增數據(oracle採用多版本數據的方式實現)

spring事務的傳播機制7種:

  1. PROPAGATION_REQUIRED:支持當前事務,如果當前不存在事務則新建一個。
  2. PROPAGATION_SUPPORTS:支持當前事務,如果不存在,就不使用事務。
  3. PROPAGATION_MANDATORY:支持當前事務,如果不存在,則拋出異常。
  4. PROPAGATION_REQUIRES_NEW:如果當前有事務存在,掛起當前事務,創建一個新的事務
  5. PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前有事務存在,掛起當前事務
  6. PROPAGATION_NEVER:以非事務方式運行,如果當前有事務存在,拋出異常
  7. PROPAGATION_NESTED:如果當前存在一個事務,則該方法運行在一個嵌套的事務中。被嵌套的事務可以從當前事務中單獨的提交和回滾。如果當前不存在事務,則開始一個新的事務。

Spring的默認事務傳播機制爲REQUIRED。

spring中隔離級別和傳播機制的配置

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT)

propagation參數配置的傳播機制

isolation參數配置的隔離級別

關於各個參數值的意義在前面已經介紹過了。

參考文獻:https://blog.csdn.net/Vincent2014Linux/article/details/89669762

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