MySQL的四種事務隔離級別
事務名稱 | A事務 | B事務 |
---|---|---|
讀未提交 | 修改未提交事務 | 生效 |
不可重複讀 | 修改提交事務 | 生效 |
可重複讀 | 修改提交事務 | 未生效 |
串行化 | B有查詢則A不能修改 | ------ |
- 事務的基本要素(ACID)----- 原子性、一致性、隔離性、持久性
- 事務的併發問題 ----- 髒讀、不可重複讀、幻讀
- 事務隔離級別 -----讀未提交(read-uncommitted)、不可重複讀(read-committed)、可重複讀(repeatable-read)、串行化(serializable)
--查看當前回話事務級別
select @@tx_isolation
--設置當前回話事務級別
set session transaction isolation level serializable
--開始事務
start transaction
--提交事務
COMMIT
--回滾事務
ROLLBACK
注意:
-
不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
-
可重複讀的隔離級別下使用了MVCC機制,select操作不會更新版本號,是快照讀(歷史版本);insert、update和delete會更新版本號,是當前讀(當前版本)。
-
不同事務對錶和行的影響
- 事務隔離級別爲讀提交時,寫數據只會鎖住相應的行
- 事務隔離級別爲可重複讀時,如果檢索條件有索引(包括主鍵索引) 的時候,默認加鎖方式是next-key 鎖;如果檢索條件沒有索引,更新數據時會鎖住整張表。一個間隙被事務加了鎖,其他事務是不能在這個間隙插入記錄的,這樣可以防止幻讀。
- 事務隔離級別爲串行化時,讀寫數據都會鎖住整張表
- 隔離級別越高,越能保證數據的完整性和一致性,但是對併發性能的影響也越大