中文字幕av高清_国产视频一二区_男女羞羞羞视频午夜视频_成人精品一区_欧美色视_在线视频这里只有精品

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > MYSQL的幻讀和我們平常說(shuō)的幻讀有什么區(qū)別?

MYSQL的幻讀和我們平常說(shuō)的幻讀有什么區(qū)別?

來(lái)源:千鋒教育
發(fā)布人:xqq
時(shí)間: 2023-10-13 19:58:38 1697198318

一、MYSQL的幻讀和我們平常說(shuō)的幻讀有什么區(qū)別

平常說(shuō)的幻讀

事務(wù)1查詢id<10的記錄時(shí),返回了2條記錄,接著事務(wù)2插入了一條id為3的記錄,并提交。接著事務(wù)1查詢id<10的記錄時(shí),返回了3條記錄,結(jié)果多了一條數(shù)據(jù)。由于Mysql存在MVCC,解決了這種情況下的幻讀。

Mysql的幻讀

Mysql的幻讀,并不是說(shuō)兩次讀取獲取的結(jié)果集不同,幻讀側(cè)重的方面是某一次的 select 操作得到的結(jié)果所表征的數(shù)據(jù)狀態(tài)無(wú)法支撐后續(xù)的業(yè)務(wù)操作。更為具體一些:select 某記錄是否存在,不存在,準(zhǔn)備插入此記錄,但執(zhí)行 insert 時(shí)發(fā)現(xiàn)此記錄已存在,無(wú)法插入,此時(shí)就發(fā)生了幻讀。

舉個(gè)例子:事務(wù)T1:

事務(wù)T2:

step1 T1: SELECT * FROM users WHERE id = 1;step2 T2: INSERT INTO users VALUES (1, ‘big cat’);step3 T1: INSERT INTO users VALUES (1, ‘big cat’);step4 T1: SELECT * FROM users WHERE id = 1;T1 :主事務(wù),檢測(cè)表中是否有 id 為 1 的記錄,沒(méi)有則插入,這是我們期望的正常業(yè)務(wù)邏輯。T2 :干擾事務(wù),目的在于擾亂 T1 的正常的事務(wù)執(zhí)行。

在 RR 隔離級(jí)別下,step1、step2 是會(huì)正常執(zhí)行的,step3 則會(huì)報(bào)錯(cuò)主鍵沖突,對(duì)于 T1 的業(yè)務(wù)來(lái)說(shuō)是執(zhí)行失敗的,這里 T1 就是發(fā)生了幻讀,因?yàn)?T1 在 step1 中讀取的數(shù)據(jù)狀態(tài)并不能支撐后續(xù)的業(yè)務(wù)操作,T1:“見(jiàn)鬼了,我剛才讀到的結(jié)果應(yīng)該可以支持我這樣操作才對(duì)啊,為什么現(xiàn)在不可以”。T1 不敢相信的又執(zhí)行了 step4,發(fā)現(xiàn)和 setp1 讀取的結(jié)果是一樣的(RR下的 MMVC機(jī)制)。此時(shí),幻讀無(wú)疑已經(jīng)發(fā)生,T1 無(wú)論讀取多少次,都查不到 id = 1 的記錄,但它的確無(wú)法插入這條他通過(guò)讀取來(lái)認(rèn)定不存在的記錄(此數(shù)據(jù)已被T2插入),對(duì)于 T1 來(lái)說(shuō),它幻讀了。其實(shí)產(chǎn)生幻讀的原因就是:行鎖只能鎖住行,即使把所有的行記錄都上鎖,也阻止不了新插入的記錄。

二、MySQL 是如何解決幻讀的

1、多版本并發(fā)控制(MVCC)(快照讀/一致性讀)

多數(shù)數(shù)據(jù)庫(kù)都實(shí)現(xiàn)了多版本并發(fā)控制,并且都是靠保存數(shù)據(jù)快照來(lái)實(shí)現(xiàn)的。以?InnoDB?為例。可以理解為每一行中都冗余了兩個(gè)字段,一個(gè)是行的創(chuàng)建版本,一個(gè)是行的刪除(過(guò)期)版本。具體的版本號(hào)(trx_id)存在?information_schema.INNODB_TRX?表中。版本號(hào)(trx_id)隨著每次事務(wù)的開(kāi)啟自增。事務(wù)每次取數(shù)據(jù)的時(shí)候都會(huì)取創(chuàng)建版本小于當(dāng)前事務(wù)版本的數(shù)據(jù),以及過(guò)期版本大于當(dāng)前版本的數(shù)據(jù)。普通的 select 就是快照讀。

select * from T where number = 1;

原理:將歷史數(shù)據(jù)存一份快照,所以其他事務(wù)增加與刪除數(shù)據(jù),對(duì)于當(dāng)前事務(wù)來(lái)說(shuō)是不可見(jiàn)的。

2、next-key 鎖 (當(dāng)前讀)

next-key 鎖包含兩部分

記錄鎖(行鎖)間隙鎖

記錄鎖是加在索引上的鎖,間隙鎖是加在索引之間的。(思考:如果列上沒(méi)有索引會(huì)發(fā)生什么?)

select * from T where number = 1 for update;select * from T where number = 1 lock in share mode;insertupdatedelete

原理:將當(dāng)前數(shù)據(jù)行與上一條數(shù)據(jù)和下一條數(shù)據(jù)之間的間隙鎖定,保證此范圍內(nèi)讀取的數(shù)據(jù)是一致的。

3、MySQL InnoDB 引擎 RR 隔離級(jí)別是否解決了幻讀

Mysql官方給出的幻讀解釋是:只要在一個(gè)事務(wù)中,第二次select多出了row就算幻讀。a事務(wù)先select,b事務(wù)insert確實(shí)會(huì)加一個(gè)gap鎖,但是如果b事務(wù)commit,這個(gè)gap鎖就會(huì)釋放(釋放后a事務(wù)可以隨意dml操作),a事務(wù)再select出來(lái)的結(jié)果在MVCC下還和名列前茅次select一樣,接著a事務(wù)不加條件地update,這個(gè)update會(huì)作用在所有行上(包括b事務(wù)新加的),a事務(wù)再次select就會(huì)出現(xiàn)b事務(wù)中的新行,并且這個(gè)新行已經(jīng)被update修改了,實(shí)測(cè)在RR級(jí)別下確實(shí)如此。如果這樣理解的話,Mysql的RR級(jí)別確實(shí)防不住幻讀。

在快照讀讀情況下,mysql通過(guò)mvcc來(lái)避免幻讀。
在當(dāng)前讀讀情況下,mysql通過(guò)next-key來(lái)避免幻讀。

select * from t where a=1;屬于快照讀
select * from t where a=1 lock in share mode;屬于當(dāng)前讀

不能把快照讀和當(dāng)前讀得到的結(jié)果不一樣這種情況認(rèn)為是幻讀,這是兩種不同的使用方式。所以我認(rèn)為mysql的rr級(jí)別是解決了幻讀的。

先說(shuō)結(jié)論,MySQL?存儲(chǔ)引擎?InnoDB?隔離級(jí)別?RR?解決了幻讀問(wèn)題。不能把快照讀和當(dāng)前讀得到的結(jié)果不一樣這種情況認(rèn)為是幻讀,這是兩種不同的使用方式。所以認(rèn)為?MySQL?的?RR?級(jí)別是解決了幻讀的。先說(shuō)結(jié)論,MySQL?存儲(chǔ)引擎?InnoDB?隔離級(jí)別?RR?解決了幻讀問(wèn)題。

如引用一問(wèn)題所說(shuō),T1?select?之后?update,會(huì)將 T2 中?insert?的數(shù)據(jù)一起更新,那么認(rèn)為多出來(lái)一行,所以防不住幻讀。但是其實(shí)這種方式是一種?bad case。如圖:

延伸閱讀1:MySQL簡(jiǎn)介

MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開(kāi)發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是較好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
Database CAN中的Update Bit是什么含義?

一、Database CAN中的Update Bit的含義在Controller Area Network (CAN) 數(shù)據(jù)庫(kù)中,Update Bit 是用于表示 CAN 數(shù)據(jù)幀的更新?tīng)顟B(tài)的位。在 C詳情>>

2023-10-13 21:43:36
數(shù)據(jù)庫(kù)對(duì)于同一查詢,為什么每次查詢時(shí)間會(huì)不一樣?

一、數(shù)據(jù)庫(kù)對(duì)于同一查詢,每次查詢時(shí)間會(huì)不一樣的原因1、有內(nèi)部操作查詢語(yǔ)句中的內(nèi)部操作,例如排序、分組、連接等,也會(huì)影響查詢的執(zhí)行時(shí)間。2...詳情>>

2023-10-13 21:22:37
sql server怎么在存儲(chǔ)過(guò)程中模糊查詢?

一、sql server在存儲(chǔ)過(guò)程中實(shí)現(xiàn)模糊查詢的方法1、Wildcard操作符Wildcard操作符:Wildcard是SQL Server支持的最基本的模糊查詢操作符,可以使...詳情>>

2023-10-13 21:00:26
用count(*)做判斷條件怎么弄的好一點(diǎn)?

一、用count(*)做判斷條件弄的好一點(diǎn)的方法1、使用索引來(lái)優(yōu)化查詢?nèi)绻樵冎猩婕暗降谋淼牧卸家烟砑恿苏_的索引,那么查詢的效率將得到大幅...詳情>>

2023-10-13 20:14:55
teradata與greenplum的區(qū)別?

一、teradata與greenplum的區(qū)別 1、架構(gòu)不同:Teradata是一種對(duì)稱多處理(Symmetric Multiprocessing,SMP)架構(gòu),而Greenplum是一種以共享無(wú)阻塞詳情>>

2023-10-13 20:07:18
快速通道
主站蜘蛛池模板: hd国产人妖ts另类视频 | 久久亚洲国产 | 成人av一区二区三区 | 99这里只有精品 | 中文字幕日韩在线视频 | 久草视频在线播放 | 日日精品 | 亚洲国产91 | 欧美日韩高清一区 | 久久久国产一区 | 欧美精品免费在线观看 | 久久免费视频一区二区 | 特黄特黄a级毛片免费专区 亚洲国产成人在线视频 | 中文字幕一区二区三区日韩精品 | 国产成人精品网站 | 亚洲国产高清视频 | 日韩国产欧美视频 | 国产一级视频 | 色噜噜在线视频 | 99re6在线视频精品免费 | 中文视频一区 | 999久久久免费精品国产 | 亚洲一区二区三 | av黄色一级 | k8久久久一区二区三区 | 久久成人精品 | 91精品久久久久久久久中文字幕 | 2018天天操夜夜操 | 五月婷婷综合激情 | 国产伦精品一区二区三区在线 | 综合激情av | 不卡视频一区二区三区 | 色先锋资源 | 中文字幕不卡在线88 | 日本精品视频在线播放 | 欧美在线视频一区二区 | 日韩福利在线 | 91在线免费看 | 日韩国产高清在线 | 国产一区二区三区久久 | 日韩美在线观看 |