liangcmwn

          導航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統計

          留言簿(1)

          文章分類

          文章檔案

          搜索

          最新評論

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

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

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

          --EOF--

          posted on 2011-08-16 09:15 liangcmwn 閱讀(139) 評論(0)  編輯  收藏 所屬分類: mysql

          主站蜘蛛池模板: 潼南县| 安达市| 天全县| 普兰店市| 马公市| 石楼县| 韶关市| 浠水县| 文水县| 枝江市| 铜川市| 广汉市| 秦皇岛市| 四平市| 奉新县| 扶余县| 永新县| 长宁县| 江川县| 六枝特区| 郯城县| 临泉县| 化德县| 柘城县| 陆良县| 万盛区| 青铜峡市| 永新县| 罗甸县| 和田县| 蚌埠市| 麻阳| 肥乡县| 双柏县| 成安县| 揭东县| 迁安市| 遵化市| 水城县| 西乡县| 乐亭县|