五月开心播播网_国内精品伊人久久久久影院对白_亚洲精品高清视频_国产精品激情_68精品久久久久久欧美_四虎免费av_97精品在线视频_欧美知名女优

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Mysql事務(wù)隔離級(jí)別原理實(shí)例解析

瀏覽:200日期:2023-10-16 08:00:04

引言

大家在面試中一定碰到過(guò)

說(shuō)說(shuō)事務(wù)的隔離級(jí)別吧?

老實(shí)說(shuō),事務(wù)隔離級(jí)別這個(gè)問(wèn)題,無(wú)論是校招還是社招,面試官都愛(ài)問(wèn)!然而目前網(wǎng)上很多文章,說(shuō)句實(shí)在話啊,我看了后我都懷疑作者弄懂沒(méi)!因?yàn)樗麄儗?duì)可重復(fù)讀(Repeatable Read)和串行化(serializable)的解析實(shí)在是看的我一頭霧水!

再加上很多書(shū)都說(shuō)可重復(fù)讀解決了幻讀問(wèn)題,比如《mysql技術(shù)內(nèi)幕--innodb存儲(chǔ)引擎》等,不一一列舉了,因此網(wǎng)上關(guān)于事務(wù)隔離級(jí)別的文章大多是有問(wèn)題的,所以再開(kāi)一文說(shuō)明!

本文所講大部分內(nèi)容,皆有官網(wǎng)作為佐證,因此對(duì)本文內(nèi)容你可以看完后,你完全可以當(dāng)概念記在腦海里,除非官網(wǎng)的開(kāi)發(fā)手冊(cè)是錯(cuò)的,否則應(yīng)當(dāng)無(wú)誤!

另外,本文會(huì)重點(diǎn)說(shuō)一下

可重復(fù)讀(Repeatable Read)是否真的解決幻讀的問(wèn)題!

正文

開(kāi)始我先提一下,根據(jù)事務(wù)的隔離級(jí)別不同,會(huì)有三種情況發(fā)生。即臟讀、不可重復(fù)讀、幻讀。這里我先不提這三種情況的定義,后面在講隔離級(jí)別的時(shí)候會(huì)補(bǔ)上。

這里,大家記住一點(diǎn),根據(jù)臟讀、不可重復(fù)讀、幻讀定義來(lái)看(自己總結(jié),官網(wǎng)沒(méi)有),有如下包含關(guān)系:

Mysql事務(wù)隔離級(jí)別原理實(shí)例解析

那么,這張圖怎么理解呢?

即,如果發(fā)生了臟讀,那么不可重復(fù)讀和幻讀是一定發(fā)生的。因?yàn)槟门K讀的現(xiàn)象,用不可重復(fù)讀,幻讀的定義也能解釋的通。但是反過(guò)來(lái),拿不可重復(fù)讀的現(xiàn)象,用臟讀的定義就不一定解釋的通了!

假設(shè)有表tx_tb如下,pId為主鍵

pId name 1 zhangsan

1、讀未提交(READ_UNCOMMITTED)

其實(shí)這個(gè)從隔離名字就可以看出來(lái),一個(gè)事務(wù)可以讀到另一個(gè)事務(wù)未提交的數(shù)據(jù)!為了便于說(shuō)明,我簡(jiǎn)單的畫(huà)圖說(shuō)明!Mysql事務(wù)隔離級(jí)別原理實(shí)例解析

如圖所示,一個(gè)事務(wù)檢索的數(shù)據(jù)被另一個(gè)未提交的事務(wù)給修改了。

官網(wǎng)對(duì)臟讀定義的地址為

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_dirty_read

其內(nèi)容為

**dirty readAn operation that retrieves unreliable data, data that was updated by another transaction but not yet committed.**

翻譯過(guò)來(lái)就是

檢索操作出來(lái)的數(shù)據(jù)是不可靠的,是可以被另一個(gè)未提交的事務(wù)修改的!

你會(huì)發(fā)現(xiàn),我們的演示結(jié)果和官網(wǎng)對(duì)臟讀的定義一致。根據(jù)我們最開(kāi)始的推理,如果存在臟讀,那么不可重復(fù)讀和幻讀一定是存在的。

2、讀已提交(READ_COMMITTED)

這個(gè)也能看的出來(lái),一個(gè)事務(wù)能讀到另一個(gè)事務(wù)已提交的數(shù)據(jù)!為了便于說(shuō)明,我簡(jiǎn)單的畫(huà)圖說(shuō)明!

Mysql事務(wù)隔離級(jí)別原理實(shí)例解析

如圖所示,一個(gè)事務(wù)檢索的數(shù)據(jù)只能被另一個(gè)已提交的事務(wù)修改。

官網(wǎng)對(duì)不可重復(fù)讀定義的地址為

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_non_repeatable_read

其內(nèi)容為

**non-repeatable readThe situation when a query retrieves data, and a later query within the same transaction retrieves what should be the same data, but the queries return different results (changed by another transaction committing in the meantime).**

翻譯過(guò)來(lái)就是

一個(gè)查詢(xún)語(yǔ)句檢索數(shù)據(jù),隨后又有一個(gè)查詢(xún)語(yǔ)句在同一個(gè)事務(wù)中檢索數(shù)據(jù),兩個(gè)數(shù)據(jù)應(yīng)該是一樣的,但是實(shí)際情況返回了不同的結(jié)果。!

ps:作者注,這里的不同結(jié)果,指的是在行不變的情況下(專(zhuān)業(yè)點(diǎn)說(shuō),主鍵索引沒(méi)變),主鍵索引指向的磁盤(pán)上的數(shù)據(jù)內(nèi)容變了。如果主鍵索引變了,比如新增一條數(shù)據(jù)或者刪除一條數(shù)據(jù),就不是不可重復(fù)讀。

顯然,我們這個(gè)現(xiàn)象符合不可重復(fù)讀的定義。下面,大家做一個(gè)思考:

這個(gè)不可重復(fù)讀的定義,放到臟讀的現(xiàn)象里是不是也可以說(shuō)的通。顯然臟讀的現(xiàn)象,也就是**讀未提交(READ_UNCOMMITTED)**的那個(gè)例子,是不是也符合在同一個(gè)事務(wù)中返回了不同結(jié)果!但是反過(guò)來(lái)就不一定通了,一個(gè)事務(wù)A中查詢(xún)兩次的結(jié)果在被另一個(gè)事務(wù)B改變的情況下,如果事務(wù)B未提交就改變了事務(wù)A的結(jié)果,就屬于臟讀,也屬于不可重復(fù)讀。如果該事務(wù)B提交了才改變事務(wù)A的結(jié)果,就不屬于臟讀,但屬于不可重復(fù)讀。3、可重復(fù)讀(REPEATABLE_READ)

這里,我改變一下順序,先上幻讀的定義

官網(wǎng)對(duì)幻讀定義的地址為

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_phantom

phantomA row that appears in the result set of a query, but not in the result set of an earlier query. For example, if a query is run twice within a transaction, and in the meantime, another transaction commits after inserting a new row or updating a row so that it matches the WHERE clause of the query.

翻譯過(guò)來(lái)就是

在一次查詢(xún)的結(jié)果集里出現(xiàn)了某一行數(shù)據(jù),但是該數(shù)據(jù)并未出現(xiàn)在更早的查詢(xún)結(jié)果集里。例如,在一次事務(wù)里進(jìn)行了兩次查詢(xún),同時(shí)另一個(gè)事務(wù)插入某一行或更新某一行數(shù)據(jù)后(該數(shù)據(jù)符合查詢(xún)語(yǔ)句里where后的條件),并提交了!

好了,接下來(lái)上圖,大家自己評(píng)定該現(xiàn)象是否符合幻讀的定義

Mysql事務(wù)隔離級(jí)別原理實(shí)例解析

顯然,該現(xiàn)象是符合幻讀的定義的。同一事務(wù)的兩次相同查詢(xún)出現(xiàn)不同行。下面,大家做一個(gè)思考:

這個(gè)幻讀的定義,放到不可重復(fù)讀的現(xiàn)象里是不是也可以說(shuō)的通。大家自行思考!反過(guò)來(lái)就不一定通了。事務(wù)第二次查詢(xún)出了一個(gè)數(shù)據(jù),但是該數(shù)據(jù)并未出現(xiàn)在第一次查詢(xún)的結(jié)果集里。如果該數(shù)據(jù)是修改數(shù)據(jù),那么該現(xiàn)象既屬于不可重復(fù)讀,也屬于幻讀。如果該數(shù)據(jù)是新增或刪除的數(shù)據(jù),那該現(xiàn)象就不屬于不可重復(fù)讀,但屬于幻讀。

接下來(lái)說(shuō)一下,為什么很多文章都產(chǎn)生誤傳,說(shuō)是可重復(fù)讀可以解決幻讀問(wèn)題!原因出自官網(wǎng)的一句話(地址是:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-record-locks)

原文內(nèi)容如下

By default, InnoDB operates in REPEATABLE READ transaction isolation level. In this case, InnoDB uses next-key locks for searches and index scans, which prevents phantom rows (see Section 14.7.4, “Phantom Rows”).

按照原本這句話的意思,應(yīng)該是

InnoDB默認(rèn)用了REPEATABLE READ。在這種情況下,使用next-key locks解決幻讀問(wèn)題!

結(jié)果估計(jì),某個(gè)國(guó)內(nèi)翻譯人員翻著翻著變成了

InnoDB默認(rèn)用了REPEATABLE READ。在這種情況下,可以解決幻讀問(wèn)題!

然后大家繼續(xù)你抄我,我抄你,結(jié)果你懂的!

顯然,漏了'使用了next-key locks!'這個(gè)條件后,意思完全改變,我們?cè)谠摳綦x級(jí)別下執(zhí)行語(yǔ)句

select * from tx_tb where pId >= 1;

是快照讀,是不加任何鎖的,根本不能解決幻讀問(wèn)題,除非你用

select * from tx_tb where pId >= 1 lock in share mode;

這樣,你就用上了next-key locks,解決了幻讀問(wèn)題!

4、串行讀(SERIALIZABLE_READ)

在該隔離級(jí)別下,所有的select語(yǔ)句后都自動(dòng)加上lock in share mode。因此,在該隔離級(jí)別下,無(wú)論你如何進(jìn)行查詢(xún),都會(huì)使用next-key locks。所有的select操作均為當(dāng)前讀!

Mysql事務(wù)隔離級(jí)別原理實(shí)例解析

OK,注意看上表紅色部分!就是因?yàn)槭褂昧薾ext-key locks,innodb將PiD=1這條索引記錄,和(1,++∞)這個(gè)間隙鎖住了。其他事務(wù)要在這個(gè)間隙上插數(shù)據(jù),就會(huì)阻塞,從而防止幻讀發(fā)生!

有的人會(huì)說(shuō),你這第二次查詢(xún)的結(jié)果,也變了啊,明顯和第一次查詢(xún)結(jié)果不一樣啊?對(duì)此,我只能說(shuō),請(qǐng)看清楚啊。這是被自己

的事務(wù)改的,不是被其他事物修改的。這不算是幻讀,也不是不可重復(fù)讀。

總結(jié)

上面羅里吧嗦一大堆,最后來(lái)一個(gè)表格做總結(jié)吧,你面試答這個(gè)表就行。上面的一切是為了這張表做準(zhǔn)備!

隔離級(jí)別 臟讀 不可重復(fù)讀 幻讀 讀未提交 是 是 是 不可重復(fù)讀 否 是 是 可重復(fù)讀 否 否 是 串行化 否 否 否

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
相關(guān)文章:
成人国产精品入口免费视频| 毛茸茸free性熟hd| 中文av字幕| 日韩精品一区国产| 亚洲电影激情视频网站| 欧美一区二区三区不卡| 草莓视频一区| 久久综合桃花网| 91香蕉视频污在线观看| 少妇荡乳情欲办公室456视频| 亚洲综合图片| 国产一区在线观看麻豆| 91最新在线免费观看| 日本在线观看一区| av中文字幕免费在线观看| 电影一区二区| 亚洲国产成人porn| 国产精品国产三级国产专播精品人| 九九99久久| 国产午夜在线播放| 人人干人人看| 91视频久久| 亚洲国产精品成人一区二区| 日本一道本久久| 97超碰人人在线| 亚洲卡通动漫在线| 久久伊人一区| av电影资源| 日韩在线免费av| 小鲜肉gaygays免费动漫| 国产精品―色哟哟| 五月天激情视频在线观看| 色老板在线视频| 亚洲综合精品四区| 欧美成人午夜免费视在线看片| 在线一区日本视频| 亚洲爱爱天堂| 国产极品尤物在线| 国产美女自拍| 亚洲人成影院在线观看| 中文字幕第六页| 丁香花高清电影在线观看完整版| 97久久久精品综合88久久| 国产在线一二区| 高清不卡一区二区| 日本888xxxx| 国产日本在线| 欧美在线一二三四区| 青青视频在线播放| 日本精品一二区| 神马影视一区二区| 久久成人精品视频| xxxxxx国产| 国产99久久久国产精品成人免费| 精品久久久久久综合日本| 欧美孕妇与黑人巨交| 麻豆91精品视频| 看一级黄色录像| www.久久99| 精品电影一区二区| 三上悠亚ssⅰn939无码播放| 在线观看午夜av| 91视视频在线直接观看在线看网页在线看| 日本午夜人人精品| 四虎成人精品| 91麻豆产精品久久久久久| 18禁免费无码无遮挡不卡网站| 韩国三级成人在线| 91精品免费视频| 天天操夜夜操天天射| 亚洲国产一区视频| 日韩av在线播| 中文精品久久| 国产精品第157页| 四虎影视4hu4虎成人| 色猫猫国产区一区二在线视频| 中国特级黄色片| 在线亚洲人成| 91精品国产高清一区二区三区 | 国产亚洲视频系列| 亚洲精品乱码久久久久久久| www.久久久.com| 亚洲欧美激情精品一区二区| 亚洲成a人片77777kkkk| 欧美一区二区三区视频在线观看| 一级片免费看| 国产精品三级美女白浆呻吟| 19禁羞羞电影院在线观看| 欧美在线一级视频| 国产精品冒白浆免费视频 | 99久久综合狠狠综合久久止| 美国av免费观看| 日韩欧美www| 免费女人黄页| 久久影视电视剧免费网站清宫辞电视| 人操人视频在线观看| 亚洲精选一二三| 久久精品视频国产| 久久综合九色综合久久久精品综合| 国产高潮在线观看| 精品国产乱码久久久久久久久| 成人免费高清在线播放| 国产精品视频久久久久| 女同性互吃奶乳免费视频| 深夜福利一区二区三区| 91久久综合亚洲鲁鲁五月天| 亚洲色图16p| 欧美性猛交xxxx免费看| 午夜国产福利在线观看| 黄色免费在线看| 亚洲成a人v欧美综合天堂| 亚洲第一天堂久久| 蜜臀久久精品| 国产精品麻豆va在线播放| jizzjizzjizzjizz日本老师| 91精品国产91久久久久久一区二区| 一色屋成人免费精品网| 在线精品视频免费观看| 永久免费成人代码| 日本一区二区乱| 妞干网在线观看视频| 亚洲全部视频| 日本视频免费在线| 欧美精品在线观看一区二区| 国产女人免费看a级丨片| 亚洲一区精品在线| 日韩高清在线观看| 亚洲精品日韩一| 亚洲国产成人在线播放| 97久久久久久| 喜爱夜蒲2在线| 精品无码人妻一区二区免费蜜桃| 国产又大又黑又粗| 天天操天天碰| 中国色在线日|韩| 精品999日本| 一区二区三区四区五区视频在线观看 | 天堂av在线一区| 亚洲福利视频一区| 久久国产精品电影| 日韩亚洲视频| 国产小视频自拍| 国产高清在线观看视频| 黄色直播在线| 亚洲经典视频| 成人午夜电影网站| 精品欧美乱码久久久久久| 91啪国产在线| 噜噜噜久久亚洲精品国产品麻豆| 毛片aaaaaa| 色图欧美色图| 日韩专区av| 日韩欧美大片| 欧美三级一区二区三区| 久久精品欧美一区二区| 国产卡二和卡三的视频| 欧美v亚洲v| 国产精品日本欧美一区二区三区| 亚洲一卡二卡三卡四卡无卡久久 | 国产欧美啪啪| 久久久久国产成人精品亚洲午夜| 亚洲男人av在线| 制服诱惑一区| 亚洲国产成人精品激情在线| 日本成人黄色网址| 136导航精品福利| 国产蜜臀97一区二区三区| 久久成人精品电影| 老头吃奶性行交视频| 99热在线只有精品| 麻豆网站在线看| 日日噜噜夜夜狠狠视频欧美人| 欧美三级中文字幕| 激情五月综合色婷婷一区二区 | 欧美a级理论片| 亚洲成人激情图| 中文字幕一区二区三区乱码| 日韩伦人妻无码| 91在线九色porny| 久久亚洲国产| 欧美亚洲愉拍一区二区| 老牛影视免费一区二区| 精品无码免费视频| 视频午夜在线| 香蕉久久夜色精品| 亚洲第一二三四五区| www.黄色网址.com| 97人妻精品一区二区三区| 国产区在线看| 极品销魂美女一区二区三区| 日韩精品中文在线观看| 欧洲精品一区二区三区久久| 国产精品爽爽久久| 亚洲欧美韩国| 国产亲近乱来精品视频| 国产精品69久久久久| 国产白丝一区二区三区| 性综艺节目av在线播放| 国产精品草草| 亚洲精品久久久久久久久久久久|