隔離級(jí)別
1、事務(wù)的隔離級(jí)別決定了事務(wù)之間可見(jiàn)的級(jí)別。
2、當(dāng)多個(gè)客戶(hù)端并發(fā)地訪(fǎng)問(wèn)同一個(gè)表時(shí),可能出現(xiàn)下面的一致性問(wèn)題:
● 臟讀取(Dirty Read)
一個(gè)事務(wù)開(kāi)始讀取了某行數(shù)據(jù),但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒(méi)有能夠及時(shí)提交,這就出現(xiàn)了臟讀取。
● 不可重復(fù)讀(Non-repeatable Read)
在同一個(gè)事務(wù)中,同一個(gè)讀操作對(duì)同一個(gè)數(shù)據(jù)的前后兩次讀取產(chǎn)生了不同的結(jié)果,這就是不可重復(fù)讀。
● 幻像讀(Phantom Read)
幻像讀是指在同一個(gè)事務(wù)中以前沒(méi)有的行,由于其他事務(wù)的提交而出現(xiàn)的新行。
InnoDB 實(shí)現(xiàn)了四個(gè)隔離級(jí)別,用以控制事務(wù)所做的修改,并將修改通告至其它并發(fā)的事務(wù):
● 讀未提交(READ UMCOMMITTED)
允許一個(gè)事務(wù)可以看到其他事務(wù)未提交的修改
● 讀已提交(READ COMMITTED)
允許一個(gè)事務(wù)只能看到其他事務(wù)已經(jīng)提交的修改,未提交的修改是不可見(jiàn)的
● 可重復(fù)讀(REPEATABLE READ)
確保如果在一個(gè)事務(wù)中執(zhí)行兩次相同的SELECT語(yǔ)句,都能得到相同的結(jié)果,不管其他事務(wù)是否提交這些修改。 (銀行總賬)
該隔離級(jí)別為InnoDB的缺省設(shè)置
● 串行化(SERIALIZABLE) 【序列化】
將一個(gè)事務(wù)與其他事務(wù)完全地隔離。
例如:
A可以開(kāi)啟事物,B也可以開(kāi)啟事物
A在事物中執(zhí)行DML語(yǔ)句時(shí),未提交
B不以執(zhí)行DML,DQL語(yǔ)句
設(shè)置服務(wù)器缺省隔離級(jí)別
● 可以在my.ini文件中使用transaction-isolation選項(xiàng)來(lái)設(shè)置服務(wù)器的缺省事務(wù)隔離級(jí)別
● 該選項(xiàng)值可以是:
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
● 例如:
[mysqld]
transaction-isolation = READ-COMMITTED
● 隔離級(jí)別也可以在運(yùn)行的服務(wù)器中動(dòng)態(tài)設(shè)置,應(yīng)使用SET TRANSACTION ISOLATION LEVEL語(yǔ)句
● 其語(yǔ)法模式為:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
其中的<isolation-level>可以是:
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
● 例如: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
1、事務(wù)隔離級(jí)別的作用范圍分為兩種:
● 全局級(jí):對(duì)所有的會(huì)話(huà)有效
● 會(huì)話(huà)級(jí):只對(duì)當(dāng)前的會(huì)話(huà)有效
2、例如:設(shè)置會(huì)話(huà)級(jí)隔離級(jí)別為READ COMMITTED :
mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
或:
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
3、設(shè)置全局級(jí)隔離級(jí)別為READ COMMITTED :
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
1、服務(wù)器變量tx_isolation(包括會(huì)話(huà)級(jí)和全局級(jí)兩個(gè)變量)中保存著當(dāng)前的會(huì)話(huà)隔離級(jí)別。
2、為了查看當(dāng)前隔離級(jí)別,可訪(fǎng)問(wèn)tx_isolation變量:
● 查看會(huì)話(huà)級(jí)的當(dāng)前隔離級(jí)別:
mysql> SELECT @@tx_isolation;
或:
mysql> SELECT @@session.tx_isolation;
● 查看全局級(jí)的當(dāng)前隔離級(jí)別:
mysql> SELECT @@global.tx_isolation;
并發(fā)事務(wù)與隔離級(jí)別示例
read uncommitted(未提交讀) --臟讀(Drity Read):
會(huì)話(huà)一 |
會(huì)話(huà)二 |
mysql> prompt s1> |
mysql> use bjpowernode |
s1>use bjpowernode |
mysql> prompt s2> |
s1>create table tx ( id int(11), num int (10) ); |
|
s1>set global transaction isolation level read uncommitted; |
|
s1>start transaction; |
|
|
s2>start transaction; |
s1>insert into tx values (1,10); |
|
|
s2>select * from tx; |
s1>rollback; |
|
|
s2>select * from tx; |
read committed(已提交讀)
會(huì)話(huà)一 |
會(huì)話(huà)二 |
s1> set global transaction isolation level read committed; |
|
s1>start transaction; |
|
|
s2>start transaction; |
s1>insert into tx values (1,10); |
|
s1>select * from tx; |
|
|
s2>select * from tx; |
s1>commit; |
|
|
s2>select * from tx; |
repeatable read(可重復(fù)讀)
會(huì)話(huà)一 |
會(huì)話(huà)二 |
s1> set global transaction isolation level repeatable read; |
|
s1>start transaction; |
s2>start transaction; |
s1>select * from tx; |
|
s1>insert into tx values (1,10); |
|
|
s2>select * from tx; |
s1>commit; |
|
|
s2>select * from tx; |