mysql隔离级别 举例_mysql的事务隔离级别举例
事務(wù)是怎么回事,之前已經(jīng)聊過(參見Oracle事務(wù)的隔離),無關(guān)哪個(gè)數(shù)據(jù)庫,只要提到事務(wù),都是這四種隔離級(jí)別。mysql的默認(rèn)隔離級(jí)別是3——可重復(fù)讀。更重要的是,是否支持事務(wù),跟mysql的存儲(chǔ)引擎相關(guān)。登陸mysql,查詢存儲(chǔ)引擎:
mysql>show engines;+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
我們看到,這么多存儲(chǔ)引擎,也就一個(gè)InnoDB支持事務(wù)。再瞧一下默認(rèn)的事務(wù)隔離級(jí)別:
mysql> select@@tx_isolation;+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00sec)
mysql> select@@global.tx_isolation;+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ |
+-----------------------+
1 row in set, 1 warning (0.00 sec)
我們看到,不管是當(dāng)前會(huì)話也好,整個(gè)系統(tǒng)也好,默認(rèn)的隔離級(jí)別都是可重復(fù)讀。
再看下默認(rèn)的事務(wù)自動(dòng)提交開關(guān):
mysql> show variables like ‘a(chǎn)utocommit‘;+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set, 1 warning (0.00 sec)
我們把上面的開關(guān)給關(guān)了,好測(cè)試:
mysql> set autocommit=off;
Query OK,0 rows affected (0.00sec)
mysql> show variables like ‘a(chǎn)utocommit‘;+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set, 1 warning (0.00 sec)
我們建個(gè)表測(cè)試一下:
mysql>create table test_wlf->(-> id INT(11),-> name VARCHAR(25)->);
Query OK,0 rows affected (0.06 sec)
插入一條數(shù)據(jù):
mysql> insert into test_wlf values(1,"wulf");
Query OK,1 row affected (0.03sec)
mysql> select *from test_wlf;+------+------+
| id | name |
+------+------+
| 1 | wulf |
+------+------+
1 row in set (0.00 sec)
再來一個(gè)窗口,同樣把a(bǔ)utocommit關(guān)掉,兩事務(wù)同時(shí)搞起:
因?yàn)楫?dāng)前的事務(wù)隔離級(jí)別是可重復(fù)讀,所以右邊的事務(wù)始終可以重復(fù)讀取到wulf這條數(shù)據(jù),即使左邊的事務(wù)新增了wumanshu這條數(shù)據(jù),按理應(yīng)該出現(xiàn)幻讀,可惜已經(jīng)被InnoDB用mvcc(多版本并發(fā)控制)解決了。換句話說,幻讀在InnoDB已經(jīng)死絕了。
接下來我們把兩個(gè)窗口都改成已提交讀:
mysql> set tx_isolation=‘READ-COMMITTED‘;
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> select@@tx_isolation;+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set, 1 warning (0.00 sec)
mysql> set global tx_isolation=‘READ-COMMITTED‘;
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> select@@global.tx_isolation;+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-COMMITTED |
+-----------------------+
1 row in set, 1 warning (0.00 sec)
再試試修改數(shù)據(jù):
以上可以看到已提交讀出現(xiàn)了不可重復(fù)讀。繼續(xù),接下來我們把兩個(gè)窗口都改成未提交讀:
mysql> set tx_isolation=‘READ-UNCOMMITTED‘;
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> set global tx_isolation=‘READ-UNCOMMITTED‘;
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> select@@tx_isolation;+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set, 1 warning (0.00sec)
mysql> select@@global.tx_isolation;+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-UNCOMMITTED |
+-----------------------+
1 row in set, 1 warning (0.00 sec)
再次更新id為2的name值,事務(wù)的中間結(jié)果都被查出來了,臟讀出現(xiàn):
原文:https://www.cnblogs.com/wuxun1997/p/14087208.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的mysql隔离级别 举例_mysql的事务隔离级别举例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 行人跟踪python_使用Python为
- 下一篇: mysql 12142_php连接mys