lqxue

          常用鏈接

          統(tǒng)計(jì)

          book

          tools

          最新評論

          [收藏]MySQLInnoDB存儲(chǔ)引擎的事務(wù)隔離級別

          我們知道,在關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)中有四個(gè)事務(wù)隔離級別:

           

          未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會(huì)話中未提交事務(wù)修改的數(shù)據(jù) 
          提交讀(Read Committed):只能讀取到已經(jīng)提交的數(shù)據(jù)。Oracle等多數(shù)數(shù)據(jù)庫默認(rèn)都是該級別 
          可重復(fù)讀(Repeated Read):可重復(fù)讀。在同一個(gè)事務(wù)內(nèi)的查詢都是事務(wù)開始時(shí)刻一致的,InnoDB默認(rèn)級別。在SQL標(biāo)準(zhǔn)中,該隔離級別消除了不可重復(fù)讀,但是還存在幻象讀 
          串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會(huì)阻塞
          查看InnoDB系統(tǒng)級別的事務(wù)隔離級別:

          mysql> SELECT @@global.tx_isolation;
          +-----------------------+
          | @@global.tx_isolation |
          +-----------------------+
          | REPEATABLE-READ       |
          +-----------------------+
          1 row in set (0.00 sec)
          查看InnoDB會(huì)話級別的事務(wù)隔離級別:

          mysql> SELECT @@tx_isolation;
          +-----------------+
          | @@tx_isolation  |
          +-----------------+
          | REPEATABLE-READ |
          +-----------------+
          1 row in set (0.00 sec)
          修改事務(wù)隔離級別:

          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的可重復(fù)讀隔離級別和其他數(shù)據(jù)庫的可重復(fù)讀是有區(qū)別的,不會(huì)造成幻象讀(phantom read),所謂幻象讀,就是同一個(gè)事務(wù)內(nèi),多次select,可以讀取到其他session insert并已經(jīng)commit的數(shù)據(jù)。下面是一個(gè)小的測試,證明InnoDB的可重復(fù)讀隔離級別不會(huì)造成幻象讀。測試涉及兩個(gè)session,分別為session 1和session 2,隔離級別都是repeateable read,關(guān)閉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 創(chuàng)建表并插入測試數(shù)據(jù)

          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 查詢,沒有數(shù)據(jù),正常,session1沒有提交,不允許臟讀

          mysql> select * from test;
          Empty set (0.00 sec)
          session 1 提交事務(wù)

          mysql> commit;
          Query OK, 0 rows affected (0.00 sec)
          session 2 查詢,還是沒有數(shù)據(jù),沒有產(chǎn)生幻象讀

          mysql> select * from test;
          Empty set (0.00 sec)
          以上試驗(yàn)版本:

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



          From:http://bbs.itren.cn/html/bbs41739.html

          posted on 2008-05-23 14:39 lqx 閱讀(232) 評論(0)  編輯  收藏 所屬分類: database

          主站蜘蛛池模板: 胶南市| 潼南县| 凌海市| 田东县| 岑巩县| 乐清市| 股票| 长宁区| 古田县| 独山县| 永仁县| 盖州市| 库伦旗| 奉化市| 武义县| 崇阳县| 麻城市| 永新县| 聊城市| 玉环县| 张家口市| 英超| 靖安县| 宣武区| 五峰| 那曲县| 塔河县| 邯郸市| 错那县| 乐亭县| 山东省| 兴仁县| 长子县| 长葛市| 扶绥县| 谢通门县| 上虞市| 保靖县| 阳西县| 玉溪市| 班玛县|