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è)查詢(xún),返回一套符合查詢(xún)條件的行, 發(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ǔ)句查詢(xún):
查看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ì)話(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 查詢(xún),沒(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 查詢(xún),還是沒(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)
本文出自:億恩科技【www.cmtents.com】
服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|