事務具有ACID四種特性。
但是Isolation并發(fā)可能引起如下問題:
1.臟讀
允許讀取到未提交的臟數(shù)據(jù)。
2.不可重復讀
如果你在時間點T1讀取了一些記錄,在T2時再想重新讀取一次同樣的這些記錄時,這些記錄可能已經(jīng)被改變、或者消失不見。
3.幻讀
解決了不重復讀,保證了同一個事務里,查詢的結果都是事務開始時的狀態(tài)(一致性)。但是,如果另一個事務同時提交了新數(shù)據(jù),本事務再更新時,就會“驚奇的”發(fā)現(xiàn)了這些新數(shù)據(jù),貌似之前讀到的數(shù)據(jù)是“鬼影”一樣的幻覺。
由ANSI/ISO定義的SQL-92標準定義的四種隔離級別
1.Read Uncommitted
2.Read Committed
3.Repeatable Read
4.Serializable
隔離解別 | 臟讀 | 不可重復讀 | 幻讀 |
Read Uncommitted | Y | Y | Y |
Read Committed | N | Y | Y |
Repeatable(default) | N | N | Y |
Serializable | N | N | N |
下面用Mysql數(shù)據(jù)庫做一些小實驗
Mysql 版本號
- mysql> select version();
- +
- | version() |
- +
- | 5.1.52-log |
- +
- 1 row in set (0.00 sec)
查看InnoDB存儲引擎 系統(tǒng)級的隔離級別 和 會話級的隔離級別
- mysql> select @@global.tx_isolation,@@tx_isolation;
- +
- | @@global.tx_isolation | @@tx_isolation |
- +
- | REPEATABLE-READ | REPEATABLE-READ |
- +
- 1 row in set (0.00 sec)
更改會話級的隔離級別
- Session 1:
- mysql> set session tx_isolation='read-uncommitted';
- Query OK, 0 rows affected (0.00 sec)
- mysql> select @@global.tx_isolation,@@tx_isolation;
- +
- | @@global.tx_isolation | @@tx_isolation |
- +
- | REPEATABLE-READ | READ-UNCOMMITTED |
- +
- 1 row in set (0.00 sec)
-
-
- Session 2:
- mysql> select @@global.tx_isolation, @@tx_isolation;
- +
- | @@global.tx_isolation | @@tx_isolation |
- +
- | REPEATABLE-READ | REPEATABLE-READ |
- +
- 1 row in set (0.00 sec)
更改系統(tǒng)級的隔離級別
- Session 1:
- mysql> set global tx_isolation='read-uncommitted';
- Query OK, 0 rows affected (0.00 sec)
- mysql> select @@global.tx_isolation,@@tx_isolation;
- +
- | @@global.tx_isolation | @@tx_isolation |
- +
- | READ-UNCOMMITTED | READ-UNCOMMITTED |
- +
- 1 row in set (0.00 sec)
-
- Session 2:
- mysql> select @@global.tx_isolation, @@tx_isolation;
- +
- | @@global.tx_isolation | @@tx_isolation |
- +
- | READ-UNCOMMITTED | REPEATABLE-READ |
- +
- 1 row in set (0.00 sec)
關閉SQL語句的自動提交
- mysql> set autocommit=off;
- Query OK, 0 rows affected (0.00 sec)
查看SQL語句自動提交是否關閉
- mysql> show variables like 'autocommit';
- +---------------+-------+
- | Variable_name | Value |
- +---------------+-------+
- | autocommit | OFF |
- +---------------+-------+
- 1 row in set (0.00 sec)
建立實驗表
- mysql> create table tao (col1 tinyint unsigned, col2 varchar(20), primary key(col1));
- Query OK, 0 rows affected (0.08 sec)
-
- mysql> show create table tao \G;
- *************************** 1. row ***************************
- Table: tao
- Create Table: CREATE TABLE `tao` (
- `col1` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `col2` varchar(20) DEFAULT NULL,
- PRIMARY KEY (`col1`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 1 row in set (0.00 sec)
演示臟讀

更改隔離級別為Read Committed后,不存在臟讀的問題。
- mysql> set global tx_isolation='read-committed';
- Query OK, 0 rows affected (0.00 sec)
- mysql> set session tx_isolation='read-committed';
- Query OK, 0 rows affected (0.00 sec)
演示不可重復讀

更改隔離級別為Repeatable Read后,不存在不可重復讀的問題。
- mysql> set global tx_isolation='repeatable-read';
- Query OK, 0 rows affected (0.00 sec)
-
- mysql> set session tx_isolation='repeatable-read';
- Query OK, 0 rows affected (0.00 sec)
幻讀

更改隔離級別為完全串行化 Serializable 后,不存在幻讀的問題。
- mysql> set global tx_isolation='serializable';
- Query OK, 0 rows affected (0.00 sec)
-
- mysql> set session tx_isolation='serializable';
- Query OK, 0 rows affected (0.00 sec)
在這種情況下,只允許一個事務在執(zhí)行,其它事務必須等待這個事務執(zhí)行完后才能執(zhí)行。沒有并發(fā),只是單純的串行。
posted on 2015-01-15 19:57
xzc 閱讀(391)
評論(3) 編輯 收藏 所屬分類:
mysql