国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Innodb的RR到底有沒有解決幻讀?看不懂你打我!

開發 前端
在RR級別中,因為有MVCC機制,對于普通的無鎖查詢,這種是屬于快照讀的,RR的快照讀在同一個事務中只會讀一次,所以在事務過程中,其他事務的變更不會影響到當前事務的查詢結果。所以這種幻讀是可以解決的。

關于Innodb中的REPEATABLE READ這種隔離級別到底有沒有解決幻讀?好像眾說紛紜,大家的說法都不一致。

有的人說,RR當然沒解決幻讀了,因為只有Serializable才能解決幻讀。

也有人說,RR解決了幻讀,因為RR中加了間隙鎖,就能解決幻讀的問題。

還有人說,只有間隙鎖是沒用的,還有MVCC也幫助RR解決了幻讀的問題。

那到底真實情況是怎么樣的呢?

?我認為,InnoDB中的REPEATABLE READ這種隔離級別通過間隙鎖+MVCC解決了大部分的幻讀問題,只有一種特殊的幻讀情況無法解決。

為什么這么說呢?這種特殊情況是怎么回事兒呢?本文就來把這個問題講清楚。(本文中所有SQL的運行環境是MySQL 5.7.9 及MySQL 8.0.30)?

什么是幻讀

?在介紹如何解決幻讀之前,有必要再明確一下什么是幻讀,確保大家理解是一致的。

幻讀就是事務在做范圍查詢(SELECT)的過程中,有另外一個事務對范圍內新增了記錄(INSERT),導致范圍查詢的結果條數不一致的現象。?

有這樣一張表:?

CREATE TABLE users (    id INT UNSIGNED AUTO_INCREMENT,    gmt_create DATETIME NOT NULL,    age INT NOT NULL,    name VARCHAR(16) NOT NULL,    PRIMARY KEY (id)
) ENGINE=InnoDB;
INSERT INTO users(gmt_create,age,name) values(now(),18,'Hollis');INSERT INTO users(gmt_create,age,name) values(now(),28,'HollisChuang');INSERT INTO users(gmt_create,age,name) values(now(),38,'Hollis666');

圖片

接著我們進行如下操作:

圖片

在這個例子中,在事務1中執行了兩次相同的查詢操作。但是兩次操作中間事務2向數據庫中增加了一條符合事務1的查詢條件的數據,最終事務1的兩次查詢得到的結果是不一樣的,這種現象就是幻讀。

MVCC與幻讀?

MVCC,是Multiversion Concurrency Control的縮寫,翻譯過來是多版本并發控制,和數據庫鎖一樣,他也是一種并發控制的解決方案。它主要用來解決讀-寫并發的情況。關于MVCC的原理可以參考《??再有人問你什么是MVCC,就把這篇文章發給他!???》

我們知道,在MVCC中有兩種讀,一種是快照讀、一種是當前讀。

所謂快照讀,就是讀取的是快照數據,即快照生成的那一刻的數據,像我們常用的普通的SELECT語句在不加鎖情況下就是快照讀。

SELECT * FROM xx_table WHERE ...

在 RC 中,每次讀取都會重新生成一個快照,總是讀取行的最新版本。


在 RR 中,快照會在事務中第一次SELECT語句執行時生成,只有在本事務中對數據進行更改才會更新快照。


那么也就是說,如果在RR下,一個事務中的多次查詢,是不會查詢到其他的事務中的變更內容的,所以,也就是可以解決幻讀的。

所以,針對上面的例子,如果我們把事務隔離級別設置為RR,那么因為有了MVCC的機制,就能解決幻讀的問題:?

圖片

可以看到,同一個事務中的兩次查詢結果是一樣的,就是在RR級別下,因為有快照讀,所以第二次查詢其實讀取的是一個快照數據。

間隙鎖與幻讀

?上面我們講過了MVCC能解決RR級別下面的快照讀的幻讀問題,那么當前讀下面的幻讀問題怎么解決呢?

當前讀就是讀取最新數據,所以,加鎖的 SELECT,或者對數據進行增刪改都會進行當前讀,比如:?

SELECT * FROM xx_table LOCK IN SHARE MODE;
SELECT * FROM xx_table FOR UPDATE;
INSERT INTO xx_table ...
DELETE FROM xx_table ...
UPDATE xx_table ...

舉一個下面的例子:

圖片

像上面這種情況,在RR的級別下,當我們使用SELECT … FOR UPDATE的時候,會進行加鎖,不僅僅會對行記錄進行加鎖,還會對記錄之間的間隙進行加鎖,這就叫做間隙鎖(參考:??數據庫的鎖,到底鎖的是什么????)。因為記錄之間的間隙被鎖住了,所以事務2的插入操作就被阻塞了,一直到事務1把鎖釋放掉他才能執行成功。

因為事務2無法插入數據成功,所以也就不會存在幻讀的現象了。所以,在RR級別中,通過加入間隙鎖的方式,就避免了幻讀現象的發生。

解決不了的幻讀

前面我們介紹了快照讀(無鎖查詢)和當前讀(有鎖查詢)下是如何解決幻讀的問題的,但是,上面的例子就是幻讀的所有情況了嗎?顯然并不是。

我們說MVCC只能解決快照讀的幻讀,那如果在一個事務中發生了當前讀,并且在另一個事務插入數據前沒來得及加間隙鎖的話,會發生什么呢?

那么,我們稍加修改一下上面的SQL代碼,通過當前讀的方式進行查詢數據:

圖片

在上面的例子中,在事務1中,我們并沒有在事務開啟后立即加鎖,而是進行了一次普通的查詢,然后事務2插入數據成功之后,再通過事務1進行了2次查詢。

?我們發現,事務1后面的兩次查詢結果完全不一樣,沒加鎖的情況下,就是快照讀,讀到的數據就和第一次查詢是一樣的,就不會發生幻讀。但是第二次查詢加了鎖,就是當前讀,那么讀取到的數據就有其他事務提交的數據了,就發生了幻讀。

那么,如果你理解了上面的這個例子,并且你也理解了當前讀的概念,那么你很容易就能想到,下面的這個CASE其實也是會發生幻讀的:

圖片

這里發生幻讀的原理,和上面的例子其實是一樣的,那就是MVCC只能解決快照讀中的幻讀問題,而對于當前讀(SELECT FOR UPDATE、UPDATE、DELETE等操作)還是會產生幻讀的現象的。

UPDATE語句也是一種當前讀,所以它是可以讀到其他事務的提交結果的。

為什么事務1的最后一次查詢和倒數第二次查詢的結果也不一樣呢?

是因為根據快照讀的定義,在RR中,如果本事務中發生了數據的修改,那么就會更新快照,那么最后一次查詢的結果也就發生了變化。

如何避免幻讀

?那么了解了幻讀的解決場景,以及不能解決的幾個CASE之后,我們來總結一下該如何解決幻讀的問題呢?

首先,如果想要徹底解決幻讀的問題,在InnoDB中只能使用Serializable這種隔離級別。

圖片圖源:MySQL 8.0 Reference Manual

那么,如果想在一定程度上解決或者避免發生幻讀的話,使用RR也可以,但是RC、RU肯定是不行的。

在RR級別中,能使用快照讀(無鎖查詢)的就使用快照讀,這樣不僅可以減少鎖沖突,提升并發度,而且還能避免幻讀的發生。

那么,如果在并發場景中,一定要加鎖的話怎么辦呢?那就一定要在事務一開始就立即加鎖,這樣就會有間隙鎖,也能有效的避免幻讀?的發生。

但是需要注意的是,間隙鎖是導致死鎖的一個重要根源~所以,用起來也需要慎重。?

總結

在RC級別中,幻讀是沒有辦法解決的,因為RC中快照讀是每一次都會重新生成快照,并且RC中也不會有間隙鎖。

在RR級別中,因為有MVCC機制,對于普通的無鎖查詢,這種是屬于快照讀的,RR的快照讀在同一個事務中只會讀一次,所以在事務過程中,其他事務的變更不會影響到當前事務的查詢結果。所以這種幻讀是可以解決的。

當時,MVCC只能對快照讀起作用,而對于加鎖的讀請求,這種屬于當前讀,當前讀的話是可以查詢到其他事務的變更的,所以會產生幻讀。

?想要解決幻讀,可以使用Serializable這種隔離級別,或者使用RR也能解決大部分的幻讀問題。?

在RR級別下,為了避免幻讀的發生,要么就是使用快照讀,要么就是在事務一開始就加鎖。?

責任編輯:姜華 來源: Hollis
相關推薦

2024-04-25 08:16:06

InnodbReadMVCC

2017-06-16 09:22:22

數據結構算法鏈表

2021-08-26 06:58:15

Innodb RR隔離級別

2022-07-26 14:38:08

JavaScriptWeb安全自動化

2023-08-09 17:22:30

MVCCMySQL數據

2024-10-14 12:56:28

2019-12-06 14:50:49

APP錄音隱私

2019-05-28 13:50:27

MySQL幻讀數據庫

2019-12-09 08:29:26

Netty架構系統

2012-09-21 09:16:48

開源云平臺云計算OpenStack C

2024-04-24 08:26:35

事務數據InnoDB

2015-04-09 13:32:16

編程編程前途

2022-06-16 14:07:26

Java代碼代碼review

2020-03-30 16:45:06

代碼看不懂

2021-12-09 11:59:49

JavaScript前端提案

2022-12-12 07:40:36

服務器項目Serverless

2024-03-20 08:12:12

分庫分表數據

2023-06-30 08:01:04

Reactuse關鍵詞

2024-05-24 11:54:11

2022-02-07 09:05:00

GitHub功能AI
點贊
收藏

51CTO技術棧公眾號

亚洲色图丝袜| 亚洲另类在线视频| 国产精品成人播放| 日韩成人伦理| 久久婷婷综合色| 极品少妇xxxx精品少妇| 成人欧美一区二区三区视频 | 久久久久久久爱| 欧美日韩国产网站| 日韩av网站电影| 爱看av在线入口| 欧美一级高清片| 巨大荫蒂视频欧美大片| 欧美日韩免费视频| 免费在线观看黄| 91精品国产综合久久精品性色| 人人干在线视频| 在线成人高清不卡| 午夜影院免费在线| 欧美一级黄色录像| 97人澡人人添人人爽欧美| 欧美va亚洲va在线观看蝴蝶网| 在线免费观看的av网站| 欧美日韩久久一区| 亚洲小说区图片区都市| 精品国产电影一区二区| 污视频在线免费观看网站| 91精品久久久久久蜜臀| 黄网av在线| 亚洲天堂成人在线| 欧美成人app| 成人444kkkk在线观看| 9l视频自拍九色9l视频成人| 日韩av片电影专区| 日韩一区亚洲二区| 久久久国产精品一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 影音先锋在线亚洲| 91免费视频观看| 国产美女在线播放| 91精品国产综合久久小美女| 成人激情综合| 国产va免费精品高清在线观看 | 精品一区二区在线观看| 国产精品裸体瑜伽视频| 国产女人aaa级久久久级| 亚洲男男gay视频| 一本久道中文字幕精品亚洲嫩| 一区二区三区视频网站| 亚洲欧美日韩视频一区| av综合网址| 51成人做爰www免费看网站| 久久一区激情| www黄色av| 福利二区91精品bt7086| 理论片午夜视频在线观看| 日韩中文有码在线视频| 精品久久久久久久久久久下田 | 日韩一级在线观看| 国产亚洲精彩久久| 国产日韩av在线播放| 日韩成人dvd| 人善交video高清| 欧美一区二区三区人| 视频在线日韩| 91精品久久久久久久久| 激情综合一区二区三区| 好紧好硬好湿我太爽了| 欧美一区二区三区视频免费| 国产一区2区在线观看| 91麻豆蜜桃| 91社区在线播放| av片在线免费观看| 色中色综合影院手机版在线观看| 欧美精品aa| 自拍偷拍 国产| 精品精品国产高清a毛片牛牛 | 宅男宅女性影片资源在线1| 亚洲国产成人精品一区二区| 日韩成人av在线资源| 日韩福利视频| 亚洲国产精品一区二区www| 日韩性xxx| 国产另类第一区| 中文字幕一区在线| 美女的胸无遮挡在线观看| 国产精品伦子伦免费视频| 国产福利一区在线观看| 欧美人体大胆444www| 欧美人在线观看| 欧美aaa在线| 日本天堂在线| 91av在线视频观看| 懂色av一区二区三区免费观看| 北条麻妃在线| 国产精品国产三级国产专播精品人 | 国产精品成人a在线观看| www..com日韩| 亚洲第一二三四五区| 欧美在线视屏| eeuss在线观看| 韩剧1988免费观看全集| 成人午夜免费av| 都市激情久久综合| 亚洲一区二区免费在线| 亚洲欧洲制服丝袜| 久久精品免视看国产成人| 国产日韩第一页| 欧美一区二区三区播放老司机| 天天射综合网视频| 免费成年网站| 欧美亚洲在线观看| 97超碰欧美中文字幕| 亚洲综合电影| 特级毛片在线免费观看| 欧美三级电影精品| 欧美另类专区| 色播色播色播色播色播在线 | 一本一道久久a久久精品综合蜜臀| 久久国产精品免费精品3p| 亚洲深夜福利网站| 亚洲欧美高清| 深夜福利在线视频| 国产精品成人播放| 亚洲国产成人porn| 精品72久久久久中文字幕| 久草在线免费二| 91精品国产电影| 日韩一区在线免费观看| 一区二区三区高清在线观看| 日本成年人网址| 久久激情视频免费观看| 懂色av一区二区在线播放| 国产综合色在线观看| 青青草国产免费| 国产精品一区二区在线播放 | 玖玖在线播放| 夜夜爽99久久国产综合精品女不卡| 91精品福利在线一区二区三区| 亚洲大胆视频| 曰本三级在线| 老司机av福利| 精品亚洲一区二区三区| 国产精品小仙女| 亚洲三级在线| 三级免费网站| 91中文精品字幕在线视频| 91国偷自产一区二区三区观看 | 久久午夜老司机| 国产午夜亚洲精品一级在线| 在线免费观看视频黄| 国产精品96久久久久久| 欧美性xxxxhd| 香蕉久久a毛片| 亚洲第一影院| 成人手机电影网| 日韩精选在线| 懂色aⅴ精品一区二区三区| 4444在线观看| 色噜噜狠狠狠综合曰曰曰| 3d成人h动漫网站入口| 欧美日韩国产免费观看| 精品176二区| 中文字幕黄色大片| 成人免费在线视频| 国产999精品久久| 黑人一区二区三区| 久久国产这里只有精品| 天天揉久久久久亚洲精品| 久草视频在线看| 免费在线成人av| 亚洲午夜小视频| 国产精品久久久久久久久免费樱桃| 偷拍一区二区| 日本私人网站在线观看| 国产a级片免费看| 国模视频一区二区三区| 日本韩国欧美在线| 国产精品中文字幕日韩精品| 精品日产乱码久久久久久仙踪林| 你懂的视频在线| 91网站在线观看免费| 久久久久亚洲精品国产| 欧美日韩在线播放| 久久天天做天天爱综合色| 在线成人激情| 91av一区| www.91在线| 日韩av一二三四| 国产精品视频入口| 精品久久久av| 欧美丝袜丝交足nylons图片| av午夜一区麻豆| 欧美精品偷拍| 秋霞午夜一区二区三区视频| 求av网址在线观看| 免费男女羞羞的视频网站中文版 | 亚洲日本在线a| 精品一区二区三区免费| 日韩精品中文字幕第1页|