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

咱們知道,在關係數據庫標準中有四個事務隔離級別:mysql

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

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

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

  • 串行讀(Serializable):徹底串行化的讀,每次讀都須要得到表級共享鎖,讀寫相互都會阻塞測試

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

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

查看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)it

mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
io

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)innodb

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)

相關文章
相關標籤/搜索