SQL 標(biāo)準(zhǔn)用三個(gè)必須在并行的事務(wù)之間避免的現(xiàn)象定義了四個(gè)級(jí)別的事務(wù)隔離。 這些不希望發(fā)生的現(xiàn)象是:
臟讀(dirty reads)
一個(gè)事務(wù)讀取了另一個(gè)未提交的并行事務(wù)寫(xiě)的數(shù)據(jù)。
不可重復(fù)讀(non-repeatable reads)
-
一個(gè)事務(wù)重新讀取前面讀取過(guò)的數(shù)據(jù), 發(fā)現(xiàn)該數(shù)據(jù)已經(jīng)被另一個(gè)已提交的事務(wù)修改過(guò)。
幻讀(phantom read)
一個(gè)事務(wù)重新執(zhí)行一個(gè)查詢,返回一套符合查詢條件的行, 發(fā)現(xiàn)這些行因?yàn)槠渌罱峤坏氖聞?wù)而發(fā)生了改變。
SQL 事務(wù)隔離級(jí)別
離級(jí)別 臟讀(Dirty Read) 不可重復(fù)讀(NonRepeatable Read) 幻讀 (Phantom Read)
讀未提交(Read uncommitted) 可能 可能 可能
讀已提交(Read committed) 不可能 可能 可能
可重復(fù)讀 (Repeatable read) 不可能 不可能 可能
可串行化 (Serializable ) 不可能 不可能 不可能
在MySQL中默認(rèn)事務(wù)隔離級(jí)別是可重復(fù)讀 (Repeatable read).可通過(guò)SQL語(yǔ)句查詢:
查看InnoDB系統(tǒng)級(jí)別的事務(wù)隔離級(jí)別:
mysql> SELECT @@global.tx_isolation;
結(jié)果:
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ |
+-----------------------+
1 row in set (0.00 sec)
查看InnoDB會(huì)話級(jí)別的 事務(wù)隔離級(jí)別:
mysql> SELECT @@tx_isolation;
結(jié)果:
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
修改事務(wù)隔離級(jí)別:
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
InnoDB的可重復(fù)讀隔離 級(jí)別和其他數(shù)據(jù)庫(kù)的可重復(fù)讀是有區(qū)別的,不會(huì)造成幻象讀(phantom read),所謂幻象讀,就是同一個(gè)事務(wù)內(nèi),多次select,可以讀取到其他session insert并已經(jīng)commit的數(shù)據(jù)。下面是一個(gè)小的測(cè)試,證明InnoDB的可重復(fù)讀隔離級(jí)別不會(huì)造成幻象讀。測(cè)試涉及兩個(gè)session,分別為 session 1和session 2,隔離級(jí)別都是repeateable read,關(guān)閉autocommit
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
mysql> set autocommit=off;
Query OK, 0 rows affected (0.00 sec)
session 1 創(chuàng)建表并插入測(cè)試數(shù)據(jù)
mysql> create table test(i int) engine=innodb;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values(1);
Query OK, 1 row affected (0.00 sec)
session 2 查詢,沒(méi)有數(shù)據(jù),正常,session1沒(méi)有提交,不允許臟讀
mysql> select * from test;
Empty set (0.00 sec)
session 1 提交事務(wù)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
session 2 查詢,還是沒(méi)有數(shù)據(jù),沒(méi)有產(chǎn)生幻象讀
mysql> select * from test;
Empty set (0.00 sec)
以上試驗(yàn)版本:
mysql> select version();
+-------------------------+
| version() |
+-------------------------+
| 5.0.37-community-nt-log |
+-------------------------+
1 row in set (0.00 sec)
本文出自:億恩科技【1tcdy.com】
服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|