mysql四種事務隔離級別(整理)

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);

IMG_256

Serializable(可串行化)

解讀: 最高隔離級別,強制事務排序,使之不可能相互衝突。

即 在每個讀的數據行上加上共享鎖。

結果:解決髒讀,不可重複讀,幻讀

可能導致大量的超時現象和鎖競爭

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