資料庫隔離級別簡論

2021-09-11 23:02:31 字數 2184 閱讀 6454

隔離是為了保護,不同的隔離級別給與了併發事務不同的保護級別。

用於討論的表結構

create table t

( a int,

b int

);create index k_b on t (b);

一言以蔽之,幾乎沒有任何保護,能讀到其他事務未提交的狀態,意味著這個事務可能會被回滾。這種讀叫髒讀(dirty read)。

session1

# 顯示指定隔離級別為read uncommitted

set session transaction isolation level read uncommitted;

set autocommit = 0;

# 執行完這一句,執行下方session2,會讀到未提交的資料(a, b) = (5, 10)

update t set b = 10 where a = 5;

commit ;

session2

set session transaction isolation level read uncommitted;

select *

from t where b = 5;

session1

set session transaction isolation level read committed;

set autocommit = 0;

# 在session2 update語句執行之前,得(a, b) = (5, 100)

select * from t where a = 5;

# 在session2 update語句執行並提交之後,得(a, b) = (5, 104)

select * from t where a = 5;

commit;

session2

set session transaction isolation level read committed;

set autocommit = 0;

update t set b = 104 where a = 5;

commit ;

session1的事務中,兩次讀取到的資料不一致,在某些場景下是不允許的,你可以想象下:當班主任點人數的時候,每次得到的人數都不一致,多氣人啊!

避免nonrepeatable read問題的直接辦法是repeatable read。repeatable read是innodb中的預設隔離級別。repeatable read能做到在同乙個事務中,讀取的快照總是和第一次讀取的一模一樣。

repeatable read仍然會有個幻讀的問題:在同乙個是事務中,同樣的查詢查出不同的行資料來。這個定義看起來很晦澀,如果你真正實操了上面的**,思考其中的細節,相信會比較容易理解。這個問題在innodb中自動給你解決了,使用的技術叫next-key locking,有興趣請看phantom rows。

session1

set autocommit = 0;

# 第一次讀取 (a, b) = (5, 100)

select * from t where a = 5;

# session2 update語句執行後,讀取,(a, b) = (5, 100)

select * from t where a = 5;

# session2提交後,讀取,(a, b) = (5, 100)

select * from t where a = 5;

commit;

# 再次讀取,讀取,(a, b) = (5, 105)

select * from t where a = 5;

session2

set autocommit = 0;

update t set b = 105 where a = 5;

commit ;

序列化,事務之間完全不會相互干擾,不會出現上述的問題,併發程度低。

資料庫隔離級別

read uncommited 讀未提交 最低級別,可讀取未提交事物的資料,這會導致髒讀,比如 某時刻會話a修改了乙個資料,但還未提交,此時會話b,讀取了該資料,這是,會話a回滾了事物,這就導致資料出現了不一致狀態,這就是髒讀 read commited 提交讀 避免了髒讀,但會導致不可重複讀,例如...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀 不可重複讀 幻讀read uncommitted re...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...