原文:
事務隔離級别
https://schaepher.github.io/2020/04/24/acid-isolation/
事務隔離級别有四種。它們的差別在于一個修改資料的事務在送出前和送出後,另一個進行中的事務讀取到的資料是修改前還是修改後的資料。
- READ-UNCOMMITED = 讀-未送出
- READ-COMMITED = 讀-已送出
- REPEATABLE-READ = 可重複-讀 (InnoDB)
- SERIALIZABLE = 串行
以下假設事務B都處于進行中。
事務A進行中:
隔離級别 | 事務B | 問題 |
---|---|---|
READ-UNCOMMITED | 修改後 | 髒讀(事務復原) |
READ-COMMITED | 修改前 | |
REPEATABLE-READ | ||
SERIALIZABLE | 阻塞 | 并發能力低 |
事務A送出後:
不可重複讀(update/delete) | ||
修改前(快照資料 undo段) | 幻讀(insert)可通過 Next-Key Lock 解決 | |
鎖
修改資料會加 X 鎖。
查詢資料需要使用以下方式:
-
加 X 鎖SELECT ... FOR UPDATE
-
加 S 鎖SELECT ... LOCK IN SHARE MODE
鎖會在事務結束後釋放。
由于每條語句都是單獨一個事務,且資料庫使用 Auto Commit,結果是在執行語句後會自動送出事務。
是以如果不主動開啟事務或者關閉 Auto Commit,就算執行時加了鎖,在 SELECT 事務結束後會立即釋放。無法達到目的。
關閉自動送出:
SET AUTOCOMMIT=0;
開啟事務(兩者等效):
BEGIN;
START TRANSACTION;
兩種開啟事務的方式都使用
COMMIT;
來送出事務。

本文采用知識共享署名 2.5 中國大陸許可協定進行許可。歡迎轉載,演繹或用于商業目的,但是必須保留本文的署名 schaepher(包含連結)。如您有任何疑問或者授權方面的協商,請給我留言。