隨筆-314  評(píng)論-209  文章-0  trackbacks-0

          事務(wù)具有ACID四種特性。

          但是Isolation并發(fā)可能引起如下問(wèn)題:

          1.臟讀

          允許讀取到未提交的臟數(shù)據(jù)。

          2.不可重復(fù)讀

          如果你在時(shí)間點(diǎn)T1讀取了一些記錄,在T2時(shí)再想重新讀取一次同樣的這些記錄時(shí),這些記錄可能已經(jīng)被改變、或者消失不見(jiàn)。

          3.幻讀

          解決了不重復(fù)讀,保證了同一個(gè)事務(wù)里,查詢的結(jié)果都是事務(wù)開(kāi)始時(shí)的狀態(tài)(一致性)。但是,如果另一個(gè)事務(wù)同時(shí)提交了新數(shù)據(jù),本事務(wù)再更新時(shí),就會(huì)“驚奇的”發(fā)現(xiàn)了這些新數(shù)據(jù),貌似之前讀到的數(shù)據(jù)是“鬼影”一樣的幻覺(jué)。

           

          由ANSI/ISO定義的SQL-92標(biāo)準(zhǔn)定義的四種隔離級(jí)別

          1.Read Uncommitted

          2.Read Committed

          3.Repeatable Read

          4.Serializable


          隔離解別臟讀不可重復(fù)讀幻讀
          Read UncommittedYYY
          Read CommittedNYY
          Repeatable(default)NNY
          SerializableNNN

          下面用Mysql數(shù)據(jù)庫(kù)做一些小實(shí)驗(yàn)

          Mysql 版本號(hào)

           

          1. mysql> select version();  
          2. +------------+  
          3. | version()  |  
          4. +------------+  
          5. | 5.1.52-log |  
          6. +------------+  
          7. 1 row in set (0.00 sec)  

           

           

          查看InnoDB存儲(chǔ)引擎 系統(tǒng)級(jí)的隔離級(jí)別 和 會(huì)話級(jí)的隔離級(jí)別

          1. mysql> select @@global.tx_isolation,@@tx_isolation;  
          2. +-----------------------+-----------------+  
          3. | @@global.tx_isolation | @@tx_isolation  |  
          4. +-----------------------+-----------------+  
          5. REPEATABLE-READ       | REPEATABLE-READ |  
          6. +-----------------------+-----------------+  
          7. 1 row in set (0.00 sec)  

          更改會(huì)話級(jí)的隔離級(jí)別

           

          1. Session 1:  
          2. mysql> set session tx_isolation='read-uncommitted';  
          3. Query OK, 0 rows affected (0.00 sec)  
          4. mysql> select @@global.tx_isolation,@@tx_isolation;  
          5. +-----------------------+------------------+  
          6. | @@global.tx_isolation | @@tx_isolation   |  
          7. +-----------------------+------------------+  
          8. REPEATABLE-READ       | READ-UNCOMMITTED |  
          9. +-----------------------+------------------+  
          10. 1 row in set (0.00 sec)  
          11.   
          12.   
          13. Session 2:  
          14. mysql> select @@global.tx_isolation, @@tx_isolation;  
          15. +-----------------------+-----------------+  
          16. | @@global.tx_isolation | @@tx_isolation  |  
          17. +-----------------------+-----------------+  
          18. REPEATABLE-READ       | REPEATABLE-READ |  
          19. +-----------------------+-----------------+  
          20. 1 row in set (0.00 sec)  

          更改系統(tǒng)級(jí)的隔離級(jí)別

           

           

          1. Session 1:  
          2. mysql> set global tx_isolation='read-uncommitted';  
          3. Query OK, 0 rows affected (0.00 sec)  
          4. mysql> select @@global.tx_isolation,@@tx_isolation;  
          5. +-----------------------+------------------+  
          6. | @@global.tx_isolation | @@tx_isolation   |  
          7. +-----------------------+------------------+  
          8. READ-UNCOMMITTED      | READ-UNCOMMITTED |  
          9. +-----------------------+------------------+  
          10. 1 row in set (0.00 sec)  
          11.   
          12. Session 2:  
          13. mysql> select @@global.tx_isolation, @@tx_isolation;  
          14. +-----------------------+-----------------+  
          15. | @@global.tx_isolation | @@tx_isolation  |  
          16. +-----------------------+-----------------+  
          17. READ-UNCOMMITTED      | REPEATABLE-READ |  
          18. +-----------------------+-----------------+  
          19. 1 row in set (0.00 sec)  


          關(guān)閉SQL語(yǔ)句的自動(dòng)提交

           

          1. mysql> set autocommit=off;  
          2. Query OK, 0 rows affected (0.00 sec)  


          查看SQL語(yǔ)句自動(dòng)提交是否關(guān)閉

           

          1. mysql> show variables like 'autocommit';  
          2. +---------------+-------+  
          3. | Variable_name | Value |  
          4. +---------------+-------+  
          5. | autocommit    | OFF   |  
          6. +---------------+-------+  
          7. 1 row in set (0.00 sec)  

          建立實(shí)驗(yàn)表

           

           

           

          1. mysql> create table tao (col1 tinyint unsigned, col2 varchar(20), primary key(col1));  
          2. Query OK, 0 rows affected (0.08 sec)  
          3.   
          4. mysql> show create table tao \G;  
          5. *************************** 1. row ***************************  
          6.        Table: tao  
          7. Create TableCREATE TABLE `tao` (  
          8.   `col1` tinyint(3) unsigned NOT NULL DEFAULT '0',  
          9.   `col2` varchar(20) DEFAULT NULL,  
          10.   PRIMARY KEY (`col1`)  
          11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  
          12. 1 row in set (0.00 sec)  

          演示臟讀

           



          更改隔離級(jí)別為Read Committed后,不存在臟讀的問(wèn)題。

           

          1. mysql> set global tx_isolation='read-committed';  
          2. Query OK, 0 rows affected (0.00 sec)  
          3. mysql> set session tx_isolation='read-committed';  
          4. Query OK, 0 rows affected (0.00 sec)  

          演示不可重復(fù)讀

           



          更改隔離級(jí)別為Repeatable Read后,不存在不可重復(fù)讀的問(wèn)題。

           

          1. mysql> set global tx_isolation='repeatable-read';  
          2. Query OK, 0 rows affected (0.00 sec)  
          3.   
          4. mysql> set session tx_isolation='repeatable-read';  
          5. Query OK, 0 rows affected (0.00 sec)  

          幻讀

           



          更改隔離級(jí)別為完全串行化 Serializable 后,不存在幻讀的問(wèn)題。

           

          1. mysql> set global tx_isolation='serializable';  
          2. Query OK, 0 rows affected (0.00 sec)  
          3.   
          4. mysql> set session tx_isolation='serializable';  
          5. Query OK, 0 rows affected (0.00 sec)  

          在這種情況下,只允許一個(gè)事務(wù)在執(zhí)行,其它事務(wù)必須等待這個(gè)事務(wù)執(zhí)行完后才能執(zhí)行。沒(méi)有并發(fā),只是單純的串行。
          posted on 2015-01-15 19:57 xzc 閱讀(401) 評(píng)論(3)  編輯  收藏 所屬分類: mysql

          評(píng)論:
          # re: MySQL隔離級(jí)別 2015-01-15 20:00 | xzc
          SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}  回復(fù)  更多評(píng)論
            
          # re: MySQL隔離級(jí)別 2015-01-15 20:00 | xzc
          set global tx_isolation='READ-COMMITTED';  回復(fù)  更多評(píng)論
            
          # re: MySQL隔離級(jí)別 2015-03-31 10:11 | xzc
          select @@global.tx_isolation,@@tx_isolation;  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 枞阳县| 枝江市| 大埔县| 宁晋县| 兴安县| 天长市| 正镶白旗| 布拖县| 贵南县| 临邑县| 双鸭山市| 阆中市| 汪清县| 土默特左旗| 安宁市| 五峰| 南皮县| 林西县| 望奎县| 海淀区| 香格里拉县| 蓝田县| 醴陵市| 沂水县| 法库县| 班玛县| 东丰县| 札达县| 响水县| 丰镇市| 北碚区| 鄯善县| 康定县| 黎城县| 大洼县| 松滋市| 兴山县| 乐至县| 余庆县| 祁东县| 太康县|