亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mysql Innodb事務隔離級別指的是什么

發布時間:2020-12-03 10:24:43 來源:億速云 閱讀:195 作者:小新 欄目:MySQL數據庫

小編給大家分享一下Mysql Innodb事務隔離級別指的是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Mysql的事務隔離級別有四種,如下:

1、Read Uncommitted:它允許讀取其它事務改變但未提交的臟數據,同樣會導致不可重復讀幻讀問題。

2、Read Committed:可避免讀取臟數據,依然會導致不可重復讀幻讀問題。

3、REPEATABLE-READ:Mysql默認隔離級別,會導致幻讀.但mysql此級別采用MVCC一致性讀,也不會產生幻讀。

4、Serializable:最高隔離級別,會避免出現上面的問題.

可用以下方法查看當前系統的隔離級別

mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

未提交讀READ-UNCOMMITTED 臟讀、不可重復讀示例:

#session A
mysql> set session transaction isolation level read uncommitted;   #設置隔離級別為未提交讀
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from inno_tbl where id=2;
+----+------+
| id | name |
+----+------+
|  2 | John |
+----+------+
1 row in set (0.00 sec)
#session B
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update inno_tbl set name='Jack Ma' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
#session A
mysql> select * from inno_tbl where id=2;
+----+---------+
| id | name    |
+----+---------+
|  2 | Jack Ma |
+----+---------+
1 row in set (0.00 sec)

此時session A讀取到了session B修改但未提交的數據,若此時session B回滾,則A讀取到的數據便是無效的,這便是“臟數據”,由于A第一次讀取到的數據與第二次讀取到的數據不同,這便是“不可重復讀”;同理,或在B中插入新數據,A中此事務中也會讀取的新的數據行,這便是幻讀。

同樣的流程,將A的隔離級別改為read committed,則不會產生“臟讀”,但同樣會產生“不可重復讀”和“幻讀”

默認隔離級別REPEATABLE-READ下:

#session A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from inno_tbl where id=2;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | John         |
+----+--------------+
1 row in set (0.00 sec)
#session B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update inno_tbl set name='Lucy' where id=2; 
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.03 sec)
#session A
mysql> select * from inno_tbl where id=2;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | John         |
+----+--------------+
1 row in set (0.00 sec)
#注意,此時沒有產生“不可重復讀”問題,但若是為查詢加上共享鎖:
mysql> select * from inno_tbl1 where id=2 lock in share mode;
+----+---------+
| id | name    |
+----+---------+
|  2 | Lucy    |
+----+---------+
1 row in set (0.00 sec)

說明:

會話A中的事務讀取到id為2的inno_tbl表中的name字段為John,而如果此時會話B中的事務將inno_tbl中id為2的name改為Lucy并提交,若些時A中的事務再讀取此行數據時,會發現,如果直接使用select方式查詢,讀出的數據依然是舊的數據,而加上共享鎖,會讀出真正的數據。

Why?因為在innodb引擎中,mysql的增刪改查語句可以分為兩種:一種是快照讀,一種是當前讀。只有普通的查詢語句為快照讀,而剩余的增刪改和加上lock in share mode共享鎖或加上for update排它鎖的查詢語句,都屬于當前讀;當時讀讀取的是最新的數據,而快照讀讀取的不一定是最新的數據。

由此可推出:當在session A中以條件為name=John來更新或刪除時,肯定不會更新或刪除成功,如下所示:

mysql> update inno_tbl set name='張三' where name='John';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
mysql> delete from inno_tbl where name='John';
Query OK, 0 rows affected (0.00 sec)

如果把隔離級別改成Read Commited, 則A會話中的查詢語句不用加lock in share mode 或for update便可查詢出B會話中已經更改提交的最新內容. 這種情況叫做不可重復讀。寫到這里, 我有個小疑問, 是不是不可重復讀幻讀是不是互相矛盾呢? 答:不是, 不可重復讀主要針對修改, 幻讀主要針對插入和刪除。

以上是“Mysql Innodb事務隔離級別指的是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奉贤区| 潞西市| 海安县| 卢氏县| 体育| 南涧| 班戈县| 隆回县| 西丰县| 曲沃县| 若尔盖县| 南雄市| 通河县| 黄龙县| 梅州市| 喀喇沁旗| 托克逊县| 响水县| 拜城县| 锡林浩特市| 吴旗县| 淳安县| 鄯善县| 神池县| 全南县| 宁陵县| 珠海市| 汤阴县| 莲花县| 兴业县| 北流市| 金华市| 湟中县| 武穴市| 睢宁县| 加查县| 东至县| 温泉县| 大石桥市| 龙胜| 临沭县|