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