Read Uncommitted(讀取未提交內容)
解讀:事務B可以 讀取 事務A 未提交內容。
結果:導致髒讀
舉例:
事務A開啓事務:
set SESSION TRANSACTION ISOLATION LEVEL read UNCOMMITTED;
start TRANSACTION;
事務B開啓事務:
set SESSION TRANSACTION ISOLATION LEVEL read UNCOMMITTED;
start TRANSACTION;
事務A修改一條銀行賬戶餘額:
update account set balance = balance -50 where id = 1;
事務B讀取此人賬戶餘額:此時是850
select * from account;
事務A回滾賬戶餘額:
ROLLBACK;
此時是900
Read Committed(讀取提交內容)
解讀:事務B 只能讀取 事務A 提交內容 (大部分數據庫默認隔離級別,非MySQL默認級別)
結果: 解決髒讀, 導致不可重複讀(non-repeatable read)
解釋(不可重複讀): 一個事務的兩次查詢之中數據不一致,
事務B第一次查詢數據和第二次查詢數據不一致。
舉例:
事務A開啓事務:
set SESSION TRANSACTION ISOLATION LEVEL read committed;
start TRANSACTION;
事務B開啓事務:
set SESSION TRANSACTION ISOLATION LEVEL read committed;
start TRANSACTION;
事務A更新銀行餘額:
update account set balance = balance -50 where id = 1;
事務B查詢銀行餘額:(此處沒有髒讀)
select * from account;
事務A提交更新結果:
commit;
事務B查詢銀行餘額不一致:
select * from account;
第一次是900,第二次是850,如果按照第一次的900來增加餘額,那麼900+50=950,其實準確用戶此時有850+50=900。
Repeatable Read(可重複讀)
解讀: 同一事務的多個實例在併發讀取數據時,會看到同樣的數據行。(MySQL默認隔離級別)
結果: 解決髒讀,不可重複讀,導致幻讀(Phantom Read)。
解釋(幻讀): 一個事務的兩次查詢數據筆數不一致。與不可重複讀不同點在於,新增或者刪除引起的行數變化。
舉例:
事務A開啓事務:
set SESSION TRANSACTION ISOLATION LEVEL read committed;
start TRANSACTION;
事務B開啓事務:
set SESSION TRANSACTION ISOLATION LEVEL read committed;
start TRANSACTION;
事務A更新銀行餘額:
update account set balance = balance -50 where id = 1;
事務B查詢:(查詢到事務A更新前的數據)解決髒讀
select * from account;
事務A提交數據:
commit;
事務B查詢數據:(查詢到事務A更新前的數據)解決不可重複讀
select * from account;
幻讀開始
事務A和事務B開啓新事務:
sessionA: start TRANSACTION;
sessionB: start TRANSACTION;
事務A插入新數據:
insert into account value(4,'aa',123);
commit;
事務B查詢數據:(查詢不到事務A提交的數據):
select * from account;
如果事務B插入相同ID的數據:(這就是幻讀,沒有卻有此數據幻影)
insert into account value(4,'aa',123);
Serializable(可串行化)
解讀: 最高隔離級別,強制事務排序,使之不可能相互衝突。
即 在每個讀的數據行上加上共享鎖。
結果:解決髒讀,不可重複讀,幻讀
可能導致大量的超時現象和鎖競爭