隔離級別
1、事務的隔離級別決定了事務之間可見的級別。
2、當多個客戶端并發地訪問同一個表時,可能出現下面的一致性問題:
● 臟讀取(Dirty Read)
一個事務開始讀取了某行數據,但是另外一個事務已經更新了此數據但沒有能夠及時提交,這就出現了臟讀取。
● 不可重復讀(Non-repeatable Read)
在同一個事務中,同一個讀操作對同一個數據的前后兩次讀取產生了不同的結果,這就是不可重復讀。
● 幻像讀(Phantom Read)
幻像讀是指在同一個事務中以前沒有的行,由于其他事務的提交而出現的新行。
InnoDB 實現了四個隔離級別,用以控制事務所做的修改,并將修改通告至其它并發的事務:
● 讀未提交(READ UMCOMMITTED)
允許一個事務可以看到其他事務未提交的修改
● 讀已提交(READ COMMITTED)
允許一個事務只能看到其他事務已經提交的修改,未提交的修改是不可見的
● 可重復讀(REPEATABLE READ)
確保如果在一個事務中執行兩次相同的SELECT語句,都能得到相同的結果,不管其他事務是否提交這些修改。 (銀行總賬)
該隔離級別為InnoDB的缺省設置
● 串行化(SERIALIZABLE) 【序列化】
將一個事務與其他事務完全地隔離。
例如:
A可以開啟事物,B也可以開啟事物
A在事物中執行DML語句時,未提交
B不以執行DML,DQL語句
設置服務器缺省隔離級別
● 可以在my.ini文件中使用transaction-isolation選項來設置服務器的缺省事務隔離級別
● 該選項值可以是:
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
● 例如:
[mysqld]
transaction-isolation = READ-COMMITTED
● 隔離級別也可以在運行的服務器中動態設置,應使用SET TRANSACTION ISOLATION LEVEL語句
● 其語法模式為:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
其中的<isolation-level>可以是:
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
● 例如: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
1、事務隔離級別的作用范圍分為兩種:
● 全局級:對所有的會話有效
● 會話級:只對當前的會話有效
2、例如:設置會話級隔離級別為READ COMMITTED :
mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
或:
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
3、設置全局級隔離級別為READ COMMITTED :
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
1、服務器變量tx_isolation(包括會話級和全局級兩個變量)中保存著當前的會話隔離級別。
2、為了查看當前隔離級別,可訪問tx_isolation變量:
● 查看會話級的當前隔離級別:
mysql> SELECT @@tx_isolation;
或:
mysql> SELECT @@session.tx_isolation;
● 查看全局級的當前隔離級別:
mysql> SELECT @@global.tx_isolation;
并發事務與隔離級別示例
read uncommitted(未提交讀) --臟讀(Drity Read):
會話一 |
會話二 |
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(已提交讀)
會話一 |
會話二 |
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(可重復讀)
會話一 |
會話二 |
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; |