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

2022-07-30 00:09:20 字數 2297 閱讀 5383

我們知道,在關聯式資料庫標準中有四個事務隔離級別:

未提交讀(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)

mysql InnoDB儲存引擎

innodb的組成部分 1.後台執行緒 2.儲存引擎記憶體池 innodb儲存引擎記憶體緩衝池 1.記憶體緩衝池 innodb是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。因此,可將其視為基礎磁碟的資料庫系統。在資料庫系統中,由於cpu速度與磁碟速度之間的紅狗,基於磁碟的資料庫系統通常使用緩...

Mysql Innodb儲存引擎

鎖 參考資料 參考資料 行鎖 innodb的鎖是對索引加鎖,如果查詢到並沒有用到索引就會對錶進行加鎖 record lock 對單條記錄加上鎖 gap lock 間隙鎖,鎖定乙個範圍,但是不包含記錄本身 next key lock record lock gap lock,鎖定乙個方位並鎖定記錄本身...

MYSQL INNODB 儲存引擎

innodb 是事務安全的mysql儲存引擎,設計上採用了類似於oracle的架構。一般而言,在oltp的應用中,innodb應該作為核心應用表的首選儲存引擎。同時,也是因為innodb的存在,才使得mysql變得更有魅力。第一 innodb儲存引擎概述 innodb由innobase oy 公司開...