事務(wù)隔離是數(shù)據(jù)庫處理的基礎(chǔ)之一。隔離級別是在多個(gè)事務(wù)進(jìn)行更改并同時(shí)執(zhí)行查詢時(shí),對結(jié)果的性能、可靠性、一致性和可重現(xiàn)性進(jìn)行微調(diào)的設(shè)置。
InnoDB提供了標(biāo)準(zhǔn)的四個(gè)事務(wù)隔離級別:READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ和SERIALIZABLE。InnoDB的默認(rèn)隔離級別是REPEATABLE READ。
四類數(shù)據(jù)庫隔離級別和各自的并發(fā)副作用
| Isolation Level | Dirty Read | Non Repeatable Read | Phantom |
|---|---|---|---|
| READ UNCOMMITTED | Yes | Yes | Yes |
| READ COMMITTED | No | Yes | Yes |
| REPEATABLE READ | No | No | Yes |
| SERIALIZABLE | No | No | No |
四類隔離級別
-
READ UNCOMMITTED(讀未提交)
即該事務(wù)可以讀取其它事務(wù)已經(jīng)修改但是沒有提交的數(shù)據(jù)
讀取到未提交的數(shù)據(jù),也稱之為臟讀
-
READ COMMITTED(讀已提交)
該事務(wù)只能讀取其它事務(wù)已經(jīng)修改并且提交的數(shù)據(jù)
-
REPEATABLE READ(可重復(fù)讀)
該事務(wù)可以保證在事務(wù)期間,讀到的數(shù)據(jù)是一樣的,即可重復(fù)讀
-
SERIALIZABLE(序列化)
序列化指數(shù)據(jù)庫同一時(shí)間只能執(zhí)行一個(gè)事務(wù)。此時(shí)數(shù)據(jù)庫的并發(fā) 能力為1,很容易造成超時(shí),一般情況下不會使用SERIALIZABLE作為數(shù)據(jù)庫的隔離級別
三類并發(fā)副作用
-
Dirty Read(臟讀)
臟讀指的是,事務(wù)讀到了其它事務(wù)已經(jīng)修改但還沒有提交的數(shù)據(jù),如果此時(shí)正在修改該數(shù)據(jù)的事務(wù)進(jìn)行回滾操作,那么當(dāng)前事務(wù)讀到的數(shù)據(jù)就是臟數(shù)據(jù)了
-
Non Repeatable Read(不可重復(fù)讀)
不可重復(fù)讀指的是在當(dāng)前事務(wù)的執(zhí)行期間,讀取相同的數(shù)據(jù),會得到不同的結(jié)果
-
Phantom(幻讀)
幻讀指的是下面這么一種情況,事務(wù)A打算對表里指定范圍內(nèi)的數(shù)據(jù)進(jìn)行操作,事務(wù)A首先讀取了該范圍內(nèi)的數(shù)據(jù)(假如有30行),然后事務(wù)B在當(dāng)前表內(nèi)添加了5行數(shù)據(jù)(且在A將要操作的范圍內(nèi)),然后事務(wù)A對指定范圍內(nèi)的數(shù)據(jù)進(jìn)行更新操作,更新完之后再次查詢時(shí),發(fā)現(xiàn)卻對35行數(shù)據(jù)進(jìn)行了更新,這樣就產(chǎn)生了幻讀
在MySQL中設(shè)置數(shù)據(jù)庫隔離級別:
set session transaction isolation level READ UNCOMMITTED
set session transaction isolation level READ COMMITTED
set session transaction isolation level REPEATABLE READ
set session transaction isolation level SERIALIZABLE
在MySQL中查看數(shù)據(jù)庫隔離級別:
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
MySQL語句事務(wù)操作:
start transaction
select * from stocks
insert into stocks (stock) values (1000)
commit
start transaction
select * from stocks
update stocks set stock = 10 where id = 2
roolback