成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

mysql中RR與幻讀的相關問題

本篇文章給大家帶來了關于mysql的相關知識,其中主要介紹了關于RR與幻讀的相關內容,包括了MVCC原理、RR產生幻讀、RR解決幻讀等等內容,下面一起來看一下,希望對大家有幫助。

mysql中RR與幻讀的相關問題

程序員必備接口測試調試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設計、調試、文檔、自動化測試工具
后端、前端、測試,同時在線協作,內容實時同步

推薦學習:mysql視頻教程

一、前言

本文圍繞這三個話題展開學習 RR 如何解決幻讀?

mysql中RR與幻讀的相關問題

  • MVCC 原理

  • 實驗:RR 與 幻讀

  • 案例:死鎖

先來回顧下 MySQL中 InnoDB 支持的四種事務隔離 和 并發事務所帶來的一些問題:

mysql中RR與幻讀的相關問題

  • 讀未提交:能讀到一個事務的中間過程,違背了 ACID 特性,存在臟讀的問題,基本不會用到。

  • 讀提交:表示如果其他事務已經提交,那么就可以看到。在生產環境中用的并不多。

  • 可重復讀:默認級別,使用最多的一種。其特點是有 Gap 鎖(間隙鎖)。

  • 可串行化:所有的實現都是通過鎖來實現的。

并發事務處理也會帶來一些問題:臟讀、不可重復讀、幻讀

  • 臟讀:一個事務正在對一條記錄做修改,在這個事務完成并提交前,這條記錄的數據就處于不一致狀態。

  • 不可重復讀:一個事務按相同查詢條件前后兩次讀取,讀出的數據不一致(修改、刪除)。

  • 幻讀:一個事務內按相同的查詢條件重新查詢數據,卻發現其他事務插入了滿足其查詢條件的新數據。

本文脈絡梳理: RR 為了更快并發,引入 MVCC,但有幻讀的可能,為解決幻讀,引入 Gap 鎖,Gap 可能造成死鎖。

二、MVCC 原理

MVCC(多版本控制): 指數據庫中為了實現高并發的數據訪問,對數據進行多版本處理,并通過事務的可見性來保證事務能看到自己應該看到的數據版本。

MVCC 最大的好處是讀不加鎖,讀寫不沖突。

在 OLTP (On-Line Transaction Processing)應用中,讀寫不沖突很重要,幾乎所有 RDBMS 都支持 MVCC。

注意:MVCC 只在 讀提交RC 和 可重復讀RR 兩種隔離級別下工作。

注意:MVCC 只在 讀提交RC 和 可重復讀RR 兩種隔離級別下工作。

注意:MVCC 只在 讀提交RC 和 可重復讀RR 兩種隔離級別下工作。

(1)MVCC 多版本實現

MySQL 實現 MVCC 機制的時候,是基于 undo log 多版本鏈條 + ReadView 機制。

  • undo log 多版本鏈: 每一次對數據庫的修改,都會在 undo log 日志中記錄當前修改記錄的事務號及修改前數據狀態的存儲地址(即 ROLL_PTR),以便在必要的時候可以回滾到老的數據版本。

  • ReadView 機制: 在多版鏈的基礎上,控制事務讀取的可見性。(主要區別是:RC 和 RR)

這里不著重探究原理,但要有大概的概念:undo log 多版本鏈 和 ReadView 機制。

針對 undo log 多版本鏈,舉個栗子:

  • 一個讀事務查詢到當前記錄,而最新的事務還未提交。

  • 根據原子性,讀事務看不到最新數據,但可以去回滾段中找到老版本的數據,這樣就生成了多個版本。

針對 ReadView 機制: 基于 undo log 多版本鏈實現,不同事務隔離有不同處理 :

  • RC 級別的事務: 可見性比較高,它可以看到已提交的事務的所有修改。

  • RR 級別的事務: 一個讀事務中,不管其他事務對這些數據做了什么修改,以及是否提交,只要自己不提交,查詢的數據結果就不會變。

這是如何做到的呢?

RC讀提交: 每一條讀操作語句都會獲取一次 ReadView,每次更新之后,都會獲取數據庫中最新的事務提交狀態,也就可以看到最新提交的事務了,即每條語句執行都會更新其可見性視圖。

RR可重復讀: 開啟事務時不會獲取 ReadView,只有發起第一個快照讀時才會獲取 ReadView。

如果使用當前讀,都會獲取新的 ReadView,也能看到更新的數據。

(2)快照讀與當前讀

在 MVCC 并發控制中,讀操作 可以分為兩類:

快照讀:讀取的是記錄的可見版本(有可能是歷史版本), 不用加鎖 。

操作:簡單的 SELECT 操作。

當前讀:讀取的是記錄的最新版本,并且當前讀返回的記錄,都會加鎖,保證其他事務不會再并發修改這條記錄。

操作:特殊讀操作、新增/更新/刪除操作。

-- 對應 SQL 如下: -- 1. 特殊讀操作 SELECT ... FOR UPDATE SELECT ... LOCK IN SHARE MODE  -- 共享鎖 -- 2. 新增:INSERT  -- 3. 更新:UPDATE -- 4. 刪除:DELETE
登錄后復制

結合 ReadView 機制來區分:快照讀 和 當前讀:

快照讀: 在一個事務里,只有發起第一個快照讀時才會獲取 ReadView,之后的讀操作不會再獲取。

當前讀: 每次讀操作都會獲取 ReadView。

三、實驗:RR 與幻讀

面試題:在 RR 事務隔離級別下,事務A查詢一條數據,事務B新增一條數據,事務A能看到事務B的數據嘛?

mysql中RR與幻讀的相關問題

這個問題比較模糊,但大致考察點我們知曉是 RR 與 幻讀,可以將問題分為兩類:

什么情況下,RR 產生幻讀?(能看到數據)

答案:當前讀(SELECT..FOR UDPDATE、SELECT … LOCK IN SHARE MODE)

什么情況下,RR 解決幻讀?(不能看到數據)

答案:加鎖、快照讀

注意: 不可重復讀 重點在于 UPDATA 和 DELETE,而幻讀的重點在于 INSERT。

它們之間最大的區別:是如何通過鎖機制來解決它們產生的問題。

這里說的鎖只是使用悲觀鎖機制。

再來回顧下:幻讀

-- 舉個栗子:有這樣一個查詢 SQL SELECT * FROM user WHERE id < 10;
登錄后復制

在同一個事務下,T1時刻查詢出來 4 條數據,T2時刻查詢出來 8 條數據。這就產生了幻讀。

在同一個事務下,T1時刻查詢出來 8 條數據,T2時刻查詢出來 4 條數據。這就產生了幻讀。

實驗準備如下: 動手實踐起來

show variables like 'transaction_isolation'; -- 事務隔離級別 RR select version();                            -- 版本 8.0.16 show variables like '%storage_engine%';      -- 引擎 InnoDB -- 1. 手動開啟事務提交 begin;  -- 開始事務 commit; -- 提交事務 -- 2. 創建表 CREATE TABLE IF NOT EXISTS `student` ( `id` INT NOT NULL COMMENT '主鍵 id', `name` VARCHAR(50) NOT NULL COMMENT '名字', `age` TINYINT NOT NULL COMMENT '年齡', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '學生表'; -- 3. 新增數據用于實驗 INSERT INTO student (id, name, age) VALUES (5, 'kunkun', 14); INSERT INTO student (id, name, age) VALUES (30, 'ikun', 18);
登錄后復制

(1)RR 產生幻讀

實驗如下: 測試當前讀

實驗一:先 SELECT,再 SELECT … FOR UPDATE

實驗二:先 SELECT,再 UPDATE (不會產生幻讀)

實驗一:先 SELECT,再 SELECT … FOR UPDATE

-- 事務A: BEGIN; SELECT * FROM student WHERE id < 30; SELECT * FROM student WHERE id < 30 FOR UPDATE;  -- 等待事務B commit 后再執行 -- SELECT * FROM student WHERE id < 30 LOCK IN SHARE MODE; COMMIT; -- 事務B: BEGIN; INSERT INTO student (id, name, age) VALUES (20, 'wulikun', 16); COMMIT;
登錄后復制

發生情況如下圖所示:

mysql中RR與幻讀的相關問題

實驗記錄如下圖所示:

mysql中RR與幻讀的相關問題

現象結論: 當使用當前讀(SELECT … FOR UPDATE)會產生幻讀。

同樣使用 SELECT … LOCK IN SHARE MODE; 會產生幻讀。

mysql中RR與幻讀的相關問題

實驗二:先 SELECT,再 UPDATE

-- 事務A: BEGIN; SELECT * FROM student WHERE id < 30; UPDATE student SET name = 'zhiyin' WHERE id = 5;  -- 等待事務B commit 后再執行 SELECT * FROM student WHERE id < 30; COMMIT; -- 事務B: BEGIN; INSERT INTO student (id, name, age) VALUES (20, 'wulikun', 16); COMMIT;
登錄后復制

發生情況如下圖所示:

mysql中RR與幻讀的相關問題

實驗記錄如下圖所示:

mysql中RR與幻讀的相關問題

現象結論: 當前讀(UPDATE)不會產生幻讀。同樣 INSERT / DELETE 均不會。

mysql中RR與幻讀的相關問題

(2)RR 解決幻讀

實驗如下:

  • 實驗一:快照讀

  • 實驗二:加鎖(更新不存在的記錄)

  • 實驗三:加鎖(SELECT … FOR UPDATE)

實驗一:快照讀,普通 SELECT

-- 事務A: BEGIN; SELECT * FROM student; SELECT * FROM student;  -- 等待事務B commit 后再執行 COMMIT; -- 事務B: BEGIN; INSERT INTO student (id, name, age) VALUES (20, 'wulikun', 16); COMMIT;
登錄后復制

發生情況如下圖所示:

mysql中RR與幻讀的相關問題

實驗記錄如下圖所示:

mysql中RR與幻讀的相關問題

現象結論: 在 RR 事務隔離級別下,只有快照讀(SELECT)不會出現幻讀。沒有當前讀。

實驗二:加鎖 ,(更新不存在的記錄)

在 RR 隔離級別下,事務 A 使用 UPDATE 加鎖,事務 B 無法在這之間插入新數據,這樣事務 A在 UPDATE 前后讀的數據保持一致,避免了幻讀。

-- 事務A: BEGIN; SELECT * FROM student; UPDATE student SET name = 'wulikunkun' WHERE id = 18; -- 記錄不存在,產生間隙鎖 (5, 30)。 COMMIT; -- 事務B: BEGIN; INSERT INTO student (id, name, age) VALUES (10, 'zhiyin', 16); -- 需要等待事務A結束。 COMMIT; -- 事務C: BEGIN; INSERT INTO student (id, name, age) VALUES (40, 'zhiyin你太美', 32); COMMIT; -- 查詢數據庫中當前有哪些鎖 SELECT INDEX_NAME,LOCK_TYPE,LOCK_MODE,LOCK_STATUS,LOCK_DATA FROM performance_schema.data_locks;
登錄后復制

發生情況如下圖所示:

mysql中RR與幻讀的相關問題

實驗記錄如下圖所示:

mysql中RR與幻讀的相關問題

現象結論:

一開始先加 臨鍵鎖Next-key lock,鎖范圍為 (5,30]。

因為是唯一索引,且更新的記錄不存在,臨鍵鎖退化成 間隙鎖Gap,最終鎖范圍為 (5,30)。其余的記錄不受影響。

實驗三:加鎖(SELECT … FOR UPDATE)

-- 事務A: BEGIN; SELECT * FROM student; SELECT * FROM student WHERE id < 5 FOR UPDATE; COMMIT; -- 事務B: BEGIN; INSERT INTO student (id, name, age) VALUES (4, 'zhiyin', 4); -- 需要等待事務A結束。 COMMIT; -- 事務C: BEGIN; INSERT INTO student (id, name, age) VALUES (5, 'zhiyin你太美', 32); -- 插入成功 COMMIT; -- 查詢數據庫中當前有哪些鎖 SELECT INDEX_NAME,LOCK_TYPE,LOCK_MODE,LOCK_STATUS,LOCK_DATA FROM performance_schema.data_locks;
登錄后復制

發生情況如下圖所示:

mysql中RR與幻讀的相關問題

實驗記錄如下圖所示:

mysql中RR與幻讀的相關問題

現象結論:

先加 臨鍵鎖Next-key lock,鎖范圍為 (-∞,5]。

所以,id < 5 和 id = 5 的數據都插入不進去。

拓展:Gap 鎖(間隙鎖)

根據 官方文檔 可知:

  • 鎖是加在索引上的。

  • 記錄鎖: 行鎖,只會鎖定一條記錄。

  • 間隙鎖 :是在索引記錄之間的間隙上的鎖,區間為前開后開 (,)。

  • 臨鍵鎖(Next-Key Lock): 由 記錄鎖 和 間隙鎖Gap 組合起來。

  • 加鎖的基本單位是 臨鍵鎖,其加鎖區間為前開后閉 (,]。

  • 索引上的等值查詢,給唯一索引加鎖的時候,如果滿足條件,臨鍵鎖 退化為 行鎖。

  • 索引上的等值查詢,給唯一索引加鎖的時候,如果不滿足條件,臨鍵鎖 退化為 間隙鎖。注意,非等值查詢是不會優化的。

推薦學習:mysql視頻教程

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产精品久久久久JK制服 | 亚洲综合一区二区三区无码 | 忘忧草日本在线播放WWW| 欧美成人精品欧美一级乱黄| 久久99精品久久久久久蜜芽| 国产成人一区二区三区免费视频 | 日韩精品专区AV无码| 免费看成熟丰满少妇AⅤ无码精品 免费看成人毛片无码视频 | 麻豆精品一卡2卡三卡4卡免费观 | 国产成人无码精品久久久露脸| FREEZEFRAME丰满寡妇| 夜夜爽夜夜叫夜夜高潮| 亚洲国产成人乱码| 亚洲 精品 制服 校园 无码| 少妇搡BBBB搡BBB搡| 欧洲乱码伦视频免费| 免费国产成人高清在线视频| 人妻 丝袜美腿 中文字幕| 免费无码又爽又刺激激情视频软件| 久久精品国产亚洲AV蜜臀色欲| 国精产品 自偷自偷| 国产精品日本一区二区在线播放| 国产999精品2卡3卡4卡| 成人免费A级毛片天天看| MM1313亚洲国产精品无码试看 | 农村野外性BBW| 狼人青草久久网伊人| 久久久久久久精品免费老鸭窝| 精品一区二区三区无码视频 | 内射猛交XXXXⅩX最新消息| 日韩综合亚洲色在线影院| 日产精品高潮呻吟AV久久| 日本熟妇裸交ⅩXX视频全过程| 无人区乱码一区二区三区| 性高湖久久久久久久久AAAAA| 偷窥熟女大屁股对白视频| 忘忧草在线社区日本WWW| 亚洲欧美日韩久久精品| 亚洲色大成网站WWW永久网站| 亚洲欧洲精品成人久久曰| 999久久久无码国产精品| 99久热RE在线精品视频| A亚洲VA欧美VA国产综合| 宝宝好涨水快流出来免费视频| 成人免费无码A毛片| 国产亚洲日韩一区二区三区| 娇妻呻吟黑人又粗又大视频| 精品久久久无码中字| 久久久国产精品人妻AⅤ麻豆| 久久久精品妓女影院妓女网| 日本久久久久精品免费网播放| 色窝窝亚洲AV网在线观看 | 亚洲精品无码午夜福利中文字幕| 亚洲另类无码一区二区三区| 亚洲伊人情人综合网站| 综合激情丁香久久狠狠| WWW亚洲精品自慰一区二区三| 成人爽A毛片免费网站美国| 国产AV无码日韩AV无码网站| 国产精品亚洲综合一区在线观看| 河南少妇凸BBWBBW| 老外免费CSGO交易网站有哪些 | 最新国产在线拍揄自揄视频| 国产精品嫩草影院永久…| 男女性高爱潮免费网站| 日本肉体XXXX裸交| 亚洲熟妇无码AV在线少妇| 高清色惰WWW日本午夜色视频| 国产色在线 | 日韩| 久久久久国色AV免费观看| 色噜噜人妻av无码| 亚洲 无码 国产精品| JAGNEXSMAX在日本| 精品无人区麻豆乱码1区2| 男按摩师舌头伸进去了| 亚洲AⅤ中文无码字幕色本草| 亚洲乱码一卡二卡四卡乱码新区 | 色情ⅩXXX欧美色妇HD| 中国大陆高清AⅤ毛片| 啊~CAO死你个小SAO货视频| 国产SUV精品一区二区| 免费一本色道久久一区| 亚洲丰满熟女一区二区V| 中文字幕有码中文无码| 和朋友换娶妻野外夫妇3| 色窝窝无码一区二区三区色欲| 91人妻人人做人碰人人爽九色| 荡公乱妇HD在线播放BD| 狠狠综合久久AV一区二区| 男妓用舌头舔我高潮不退小说| 亚洲第一狼人伊人AV| 国产成人亚洲综合无码8| 人妻ay无码一区二区三区| 岳女四人共侍一夫婷婷| 非洲黑人狂躁日本妞| 精品无码一区二区三区| 无码激情亚洲一区| 在小巷里被强高HNP| 精品国产AV无码专区亚洲AV | 色综合天天综合欧美综合| 亚洲精品国精品久久99热| 国产精品国产三级国产专区50| 久久无码无码久久综合综合| 色视频WWW在线播放国产人成| 99RE热这里只有精品视频| 久久综合亚洲欧美成人| 亚洲精品55夜色66夜色| 爸爸入狱以后妈妈双人桥小权| 护士奶头又白又大又好摸| 我把护士日出水了视频90分钟| 成年女人毛片免费视频| 欧美日韩精品SUV| 亚洲VA中文字幕无码一二三区| Z Z〇Z〇另类女人ZOZ〇| 免费AV永久免费网址| 无码人妻少妇久久中文字幕| 中文无码AV电影在线观看网站| 国产果冻豆传媒麻婆精东影视| 日韩AV高清在线观看| 野花电影在线观看免费720| 精品久久久噜噜噜久久久 | 国内少妇BBWBBW黑森林| 欧美XXXⅩ重口变态调教| 中文字幕精品第一区二区三区| 国产人成精品香港三级在线 | 精品综合久久久久久888| 亚洲AV永久无码精品蜜芽| 差差漫画免费页面漫画在线观看| 久久久久久久久毛片精品| 亚洲日韩激情无码一区| 国产成人啪精品视频免费软件 | 成人性无码专区免费视频| 日本WV一本一道久久香蕉| 亚洲中文字幕无码一区无广告 | 国产精品一区理论片| 性妇WBBBB搡BBBB嗓小说| 国产性自爱拍偷在在线播放| 人妻中字视频中文乱码| 一本色道久久综合亚州精品蜜桃| 精品久久久久久国产| 亚洲色大成网站WWW久久| 久久ER99热精品一区二区| 野花日本中文免费完整版4| 麻豆视传媒官方直接进入| 亚洲国产成人极品综合| 精品少妇人妻AV无码专区| 野花香在线观看免费观看大全动漫 | BGMBGMBGM老头野外| 人伦片无码中文字| 岛国AV在线无码播放| 我和公发生了性关系视频| 国产亚洲欧美日韩剧的剧情介绍 | 私人微信放款24小时在线| 99久久人妻无码精品系列| 人妻熟妇女的欲乱系列| 成人无码区免费∨| 无码免费无线观看在线视| 哈昂~哈昂够了太多了动图| 亚洲午夜福利精品久久| 韩国电影办公室的在线观看 | 久久99精品久久久久久蜜芽| 伊人狠狠色丁香婷婷综合| 狠狠躁天天躁无码中文字幕图| 少妇人妻无码精品视频APP| 国产精品无码免费播放| 亚洲欧洲国产码专区在线观看| 裸体美女洗澡啪啪裸J网站 | 日韩AV蜜桃在线观看| 国产精品无码一本二本三本色| 亚洲国产精品久久精品| 麻花传媒MV在线播放高清MBA| とらぶるだいありぴーち在线| 天堂资源在线WWW中文| 成人综合色在线一区二区| 午夜成人无码福利免费视频 | 久久97久久精品免费观看黑人| 12孩岁女A处破娇小| 久久夜色精品国产亚洲AV| 野花高清在线观看免费3中文| 欧美大肚子孕妇疯狂作爱视频 | √天堂资源BT在线官网| 狂野AV人人澡人人添| 草莓丝瓜芭乐鸭脖奶茶搭配食物 | 国产成人精品一区二三区| 色噜噜狠狠色综合AV| 国语对白做受XXXXX在线| 中文字幕亚洲综合小综合在线| 少妇高潮毛片免费看| 精品国产乱码一区二区三区APP | 亚洲欧美日本中文字不卡| 欧美人妻体内射射| HEYZO高清中文字幕在线| 无码加勒比一区二区三区四区| 久久久久亚洲AV无码成人片麻豆| 野花高清视频免费观看完整版中文 | 一二三四免费观看在线6| 麻豆国产丝袜白领秘书在线观看| 成人无码区免费A∨电影| 亚洲欧美韩国综合色| 日韩成人免费VA毛片|