事務隔離級別整理筆記

事務的ACID特性

  1. 原子性
  2. 一致性(事務處理前後從一個一致性狀態變換到另一個一致性狀態)
  3. 隔離性(多個併發事務間的隔離)
  4. 持久性

無隔離處理下的幾種問題

1. 髒讀

併發的其中一個事務讀取另一個事務未提交的內容,當另一個事務回滾後發現讀的是無效數據

2. 不可重複讀

併發的其中一個事務在一開始讀取了一次數據,並在另一個事務提交後又讀取了一次數據,發現兩次讀取的數據不一致

3. 幻讀(虛讀)

併發的其中一條事務對錶內的所有行執行字段a的值從1變爲2,這時在另一條事務中在表內添加了另一條a的值爲1的數據,前一條事務會發現執行完後,表內仍有a字段值爲1的記錄

事務隔離級別

針對上述問題,設置了四種事務的隔離級別,由用戶根據業務選擇使用哪種隔離級別 ,在MySQL中默認是Repeatable Read級別,Oracle中默認是Read Committed級別。

1. 讀未提交(READ UNCOMMITTED)

可以讀到其他事務未提交的數據。

2. 讀已提交(READ COMMITTED)

只能讀到其他事務已提交的數據。

3. 可重複讀(REPEATABLE READ)

在讀已提交的基礎上,增加一點,本條事務內,讀同一份數據,以該事務第一次讀取的數據的備份爲標準(即使在此期間其他事務提交了該數據的修改,讀到的仍是原數據)。

4. 串行(SERIALIZABLE)

串行執行,該事務不能與其他事務同時操作同一個數據,必須等待操作數據的事務或串行事務提交才能繼續運行。Serializable的事務先查詢或修改了該條記錄,則其他事務對該記錄的操作均會被阻塞。

事務隔離會在寫數據的時候給數據加上排他鎖,而串行事務下讀數據的時候也會給數據加上排他鎖。

其他

查看當前事務隔離級別 SELECT @@TX_ISOLATION

設置當前事務隔離級別 SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted / read committed / repeatable read / serializable

Spring中註解設置 @Transactional(isolation = Isolation.REPEATABLE_READ)

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