最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解MySQL幻讀及如何消除

 更新時間:2021年03月29日 10:23:13   作者:丁凱  
這篇文章主要介紹了詳解MySQL 幻讀及解決方法,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下

這是一篇數(shù)據(jù)庫隔離級別的科普文章,旨在了解數(shù)據(jù)庫中著名的幻讀現(xiàn)象,為了專注,對臟讀、不可重復讀不作討論。

事務隔離級別

MySQL有四級事務隔離級別:

讀未提交 READ-UNCOMMITTED: 存在臟讀,不可重復讀,幻讀的問題
讀已提交 READ-COMMITTED:不存在臟讀,但存在不可重復讀,幻讀問題
可重復讀 REPEATABLE-READ:不存在臟讀,不可重復讀問題,但存在幻讀問題
序列化SERIALIZABLE:解決臟讀,不可重復讀,幻讀問題,但完全串行執(zhí)行,性能最低

什么是幻讀

幻讀錯誤的理解:說幻讀是事務A 執(zhí)行兩次 select 操作得到不同的數(shù)據(jù)集,即 select 1 得到10條記錄,select 2 得到11條記錄。這其實并不是幻讀,這是不可重復讀的一種,只會在 R-U R-C 級別下出現(xiàn),而在 mysql 默認的 RR 隔離級別是不會出現(xiàn)的。

這里給出我對幻讀的理解:

幻讀,并不是說事務中多次讀取獲取的結果集不同,幻讀更重要的是某次的 select 操作得到的結果集所表征的數(shù)據(jù)狀態(tài)無法支撐后續(xù)的業(yè)務操作。更為具體一些:select 記錄不存在,準備插入此記錄,但執(zhí)行 insert 時發(fā)現(xiàn)此記錄已存在,無法插入,如同產(chǎn)生了幻覺

舉個例子可能會簡化理解:

mysql> show create table user\G
*************************** 1. row ***************************
 Table: user
Create Table: CREATE TABLE `user` (
 `id` int(11) NOT NULL,
 `name` varchar(32) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

分別開啟兩個事務T1 & T2,并設置其隔離級別為Reaptable-Read:

T1:

mysql> set global transaction isolation level repeatable read;      
​
mysql> begin;
mysql> select * from user;
mysql> insert into user values (1, 'jeff');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
​
mysql> select * from user;

T2:

mysql> set global transaction isolation level repeatable read;      
​
mysql> begin;
mysql> insert into user values (1, 'jeff');
mysql> commit;

T1 事務檢測表中是否有 id 為 1 的記錄,沒有則插入

T2 插入干擾記錄,造成T1出現(xiàn)幻讀。

上例中需要確保T1事務執(zhí)行begin后才開始執(zhí)行事務T2。

上例中T1就發(fā)生了幻讀,因為 T1讀取的數(shù)據(jù)狀態(tài)與后面的動作發(fā)生了語義上的沖突:查詢的時候明明提示記錄不存在,插入的時候去提示主鍵重復,類似于出現(xiàn)幻影,因而稱之為幻讀。

如何消除幻讀

MySQL當前有兩種方式可以消除幻讀:

1. 通過對select操作手動加行X鎖(SELECT ... FOR UPDATE )。原因是InnoDB中行鎖鎖定的
是索引,縱然當前記錄不存在,當前事務也會獲得一把記錄鎖(記錄存在就加行X鎖,不
存在就加next-key lock間隙X鎖),這樣其他事務則無法插入此索引的記錄,杜絕幻
讀。
2. 進一步提升隔離級別為SERIALIZABLE
測試一下效果

mysql> begin;
​
mysql> select * from user where id = 2 for update;
mysql> insert into user values (2, 'tony');

mysql> commit;

T2:

mysql> begin;
​
mysql> insert into user values (2, 'jimmy');
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'

現(xiàn)在T1查詢時攜帶了for update,在Innodb內(nèi)會對該索引加鎖(即使當前不存在),于是事務T2的insert會被阻塞直到T1顯示提交,這樣T1成功了,對于T1來說,幻讀確實被消除了,但T2的插入會報主鍵重復,這也符合預期。

至于另外一種提升隔離級別消除幻讀的方式感興趣的可以自己嘗試,這里不再重復,其本質(zhì)是類似的,只是讓系統(tǒng)代替了手工加鎖。

總結

RR作為 mysql 事務默認隔離級別,是事務安全與性能的折中,正確認識幻讀后,開發(fā)者便可以根據(jù)需求自行決定是否需要防止幻讀。

SERIALIZABLE則是悲觀的認為幻讀時刻都會發(fā)生,故會自動的隱式的對事務所需資源加排它鎖,其他事務訪問此資源會被阻塞等待,故事務是安全的,但需要認真考慮性能。

InnoDB的鎖是針對索引,這點需要引起注意。對行記錄加鎖,如果存在,加X鎖,否則會加 next-key lock / gap 鎖 / 間隙鎖,故InnoDB可以實現(xiàn)事務對某記錄的預先占用,只要本事務還在,其他事務就別想占有它。關于鎖,后面還會再有專門的文章討論。

以上就是詳解MySQL 幻讀及如何消除的詳細內(nèi)容,更多關于MySQL 幻讀及消除的資料請關注腳本之家其它相關文章!

相關文章

  • Mysql 自定義隨機字符串的實現(xiàn)方法

    Mysql 自定義隨機字符串的實現(xiàn)方法

    前段時間接了一個項目,需要用到隨機字符串,但是mysql的庫函數(shù)沒有直接提供,需要我們自己實現(xiàn)此功能,下面小編給大家介紹下Mysql 自定義隨機字符串的實現(xiàn)方法,需要的朋友參考下吧
    2016-08-08
  • 簡單介紹MySQL中的事務機制

    簡單介紹MySQL中的事務機制

    這篇文章主要介紹了MySQL中的事務機制,通過實例介紹了大概的流程,需要的朋友可以參考下
    2015-04-04
  • mysql 維護常用命令

    mysql 維護常用命令

    需要維護mysql數(shù)據(jù)庫的朋友可以參考下。
    2009-11-11
  • mysql表優(yōu)化、分析、檢查和修復的方法詳解

    mysql表優(yōu)化、分析、檢查和修復的方法詳解

    這篇文章主要介紹了mysql表優(yōu)化、分析、檢查和修復的方法,結合實例形式較為詳細的分析了MySQL表進行優(yōu)化,分析與修復等操作的各種常見命令與使用技巧,需要的朋友可以參考下
    2016-04-04
  • MySQL語句整理及匯總介紹

    MySQL語句整理及匯總介紹

    今天小編就為大家分享一篇關于MySQL語句整理及匯總介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 在MySQL中創(chuàng)建帶有IN和OUT參數(shù)的存儲過程的方法

    在MySQL中創(chuàng)建帶有IN和OUT參數(shù)的存儲過程的方法

    這篇文章主要介紹了在MySQL中創(chuàng)建帶有IN和OUT參數(shù)的存儲過程的方法,在一定程度上簡化了操作,需要的朋友可以參考下
    2015-06-06
  • Explain命令在優(yōu)化查詢中的實際應用

    Explain命令在優(yōu)化查詢中的實際應用

    在MySQL中,EXPLAIN命令是一種非常重要的查詢優(yōu)化工具,它可以幫助我們分析SQL查詢語句的執(zhí)行計劃,以及如何優(yōu)化它們。本文介紹了Explain命令在優(yōu)化查詢中的實際應用,感興趣的小伙伴可以參考閱讀
    2023-04-04
  • MySQL數(shù)據(jù)庫之數(shù)據(jù)data?基本操作

    MySQL數(shù)據(jù)庫之數(shù)據(jù)data?基本操作

    這篇文章主要介紹了MySQL數(shù)據(jù)庫之數(shù)據(jù)data?基本操作,文章基于MySQL的相關資料展開數(shù)據(jù)data?基本操作,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • mysql 5.7.18 winx64安裝配置方法圖文教程

    mysql 5.7.18 winx64安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了windows7下mysql 5.7.18 winx64安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • MySQL5.7更改密碼時出現(xiàn)ERROR 1054 (42S22)的解決方法

    MySQL5.7更改密碼時出現(xiàn)ERROR 1054 (42S22)的解決方法

    這篇文章主要為大家詳細介紹了MySQL5.7更改密碼時出現(xiàn)ERROR 1054 (42S22)的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評論

诸城市| 丰台区| 康平县| 页游| 和田市| 邓州市| 安西县| 峨边| 保靖县| 柳州市| 高平市| 大港区| 长岛县| 黑龙江省| 南雄市| 洱源县| 定兴县| 乌拉特后旗| 建始县| 远安县| 监利县| 柳河县| 黄陵县| 区。| 平谷区| 广州市| 兰西县| 黎平县| 七台河市| 廊坊市| 锡林浩特市| 中宁县| 青浦区| 鹰潭市| 德钦县| 长春市| 林州市| 会泽县| 建德市| 晴隆县| 正定县|