久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

179次閱讀
沒有評論

共計 3014 個字符,預計需要花費 8 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

丸趣 TV 小編給大家分享一下 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 事務隔離級別指的是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!

向 AI 問一下細節

丸趣 TV 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-18發表,共計3014字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 孝感市| 腾冲县| 江陵县| 武宣县| 遂昌县| 航空| 腾冲县| 祁东县| 汉川市| 古蔺县| 井陉县| 名山县| 东莞市| 东乌珠穆沁旗| 上饶县| 东港市| 循化| 绥棱县| 柞水县| 汕尾市| 乐业县| 新余市| 吐鲁番市| 广昌县| 冕宁县| 会理县| 高州市| 石嘴山市| 双城市| 灌阳县| 垫江县| 民乐县| 本溪市| 通化市| 原平市| 华阴市| 平邑县| 陵川县| 新兴县| 五寨县| 松潘县|