程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL InnoDB存儲引擎的事務隔離級別

MySQL InnoDB存儲引擎的事務隔離級別

編輯:關於MYSQL數據庫

  我們知道,在關系數據庫標准中有四個事務隔離級別:

  未提交讀(Read Uncommitted):允許髒讀,也就是可能讀取到其他會話中未提交事務修改的數據

  提交讀(Read Committed):只能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別

  可重復讀(Repeated Read):可重復讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標准中,該隔離級別消除了不可重復讀,但是還存在幻象讀

  串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞

  查看InnoDB系統級別的事務隔離級別:

mysql> SELECT @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ   |
+-----------------------+
1 row in set (0.00 sec)

  查看InnoDB會話級別的事務隔離級別:

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

  修改事務隔離級別:

  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的可重復讀隔離級別和其他數據庫的可重復讀是有區別的,不會造成幻象讀(phantom read),所謂幻象讀,就是同一個事務內,多次select,可以讀取到其他session insert並已經commit的數據。下面是一個小的測試,證明InnoDB的可重復讀隔離級別不會造成幻象讀。測試涉及兩個session,分別為session 1和session 2,隔離級別都是repeateable read,關閉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 創建表並插入測試數據

  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 查詢,沒有數據,正常,session1沒有提交,不允許髒讀

  mysql> select * from test;

  Empty set (0.00 sec)

  session 1 提交事務

  mysql> commit;

  Query OK, 0 rows affected (0.00 sec)

  session 2 查詢,還是沒有數據,沒有產生幻象讀

  mysql> select * from test;

  Empty set (0.00 sec)

  以上試驗版本:

mysql> select version();
+-------------------------+
| version()       |
+-------------------------+
| 5.0.37-community-nt-log |
+-------------------------+
1 row in set (0.00 sec)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved