事務的ACID特性
- 原子性
- 一致性(事務處理前後從一個一致性狀態變換到另一個一致性狀態)
- 隔離性(多個併發事務間的隔離)
- 持久性
無隔離處理下的幾種問題
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)