婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解MySQL中事務隔離級別的實現原理

詳解MySQL中事務隔離級別的實現原理

熱門標簽:百應電話機器人優勢 曲靖移動外呼系統公司 外呼系統打電話上限是多少 武漢網絡外呼系統服務商 電話外呼系統改號 南昌三維地圖標注 啥是企業400電話辦理 怎樣在地圖標注銷售區域 地圖標注費用是多少

前言

說到數據庫事務,大家腦子里一定很容易蹦出一堆事務的相關知識,如事務的ACID特性,隔離級別,解決的問題(臟讀,不可重復讀,幻讀)等等,但是可能很少有人真正的清楚事務的這些特性又是怎么實現的,為什么要有四個隔離級別。

今天我們就先來聊聊MySQL中事務的隔離性的實現原理,后續還會繼續出文章分析其他特性的實現原理。

當然MySQL博大精深,文章疏漏之處在所難免,歡迎批評指正。

說明

MySQL的事務實現邏輯是位于引擎層的,并且不是所有的引擎都支持事務的,下面的說明都是以InnoDB引擎為基準。

定義

隔離性(isolation)指的是不同事務先后提交并執行后,最終呈現出來的效果是串行的,也就是說,對于事務來說,它在執行過程中,感知到的數據變化應該只有自己操作引起的,不存在其他事務引發的數據變化。

隔離性解決的是并發事務出現的問題。

標準SQL隔離級別

隔離性最簡單的實現方式就是各個事務都串行執行了,如果前面的事務還沒有執行完畢,后面的事務就都等待。但是這樣的實現方式很明顯并發效率不高,并不適合在實際環境中使用。

為了解決上述問題,實現不同程度的并發控制,SQL的標準制定者提出了不同的隔離級別:未提交讀(read uncommitted)、提交讀(read committed)、可重復讀(repeatable read)、序列化讀(serializable)。其中最高級隔離級別就是序列化讀,而在其他隔離級別中,由于事務是并發執行的,所以或多或少允許出現一些問題。見以下的矩陣表:

隔離級別(+:允許出現,-:不允許出現) 臟讀 不可重復讀 幻讀
未提交讀                                  +         +               +        
提交讀                                    -         +               +        
可重復讀                                  -         -               +        
序列化讀                                  -         -               -        

注意,MySQL的InnoDB引擎在提交讀級別通過MVCC解決了不可重復讀的問題,在可重復讀級別通過間隙鎖解決了幻讀問題,具體見下面的分析。

實現原理

標準SQL事務隔離級別實現原理

我們上面遇到的問題其實就是并發事務下的控制問題,解決并發事務的最常見方式就是悲觀并發控制了(也就是數據庫中的鎖)。標準SQL事務隔離級別的實現是依賴鎖的,我們來看下具體是怎么實現的:

事務隔離級別    實現方式                                                     
未提交讀(RU) 事務對當前被讀取的數據不加鎖;

事務在更新某數據的瞬間(就是發生更新的瞬間),必須先對其加行級共享鎖,直到事務結束才釋放。
提交讀(RC)    事務對當前被讀取的數據加行級共享鎖(當讀到時才加鎖),一旦讀完該行,立即釋放該行級共享鎖;

事務在更新某數據的瞬間(就是發生更新的瞬間),必須先對其加行級排他鎖,直到事務結束才釋放。
可重復讀(RR) 事務在讀取某數據的瞬間(就是開始讀取的瞬間),必須先對其加行級共享鎖,直到事務結束才釋放;

事務在更新某數據的瞬間(就是發生更新的瞬間),必須先對其加行級排他鎖,直到事務結束才釋放。
序列化讀(S)   事務在讀取數據時,必須先對其加表級共享鎖 ,直到事務結束才釋放;

事務在更新數據時,必須先對其加表級排他鎖 ,直到事務結束才釋放。

可以看到,在只使用鎖來實現隔離級別的控制的時候,需要頻繁的加鎖解鎖,而且很容易發生讀寫的沖突(例如在RC級別下,事務A更新了數據行1,事務B則在事務A提交前讀取數據行1都要等待事務A提交并釋放鎖)。

為了不加鎖解決讀寫沖突的問題,MySQL引入了MVCC機制,詳細可見我以前的分析文章:一文讀懂數據庫中的樂觀鎖和悲觀鎖和MVCC。

InnoDB事務隔離級別實現原理

在往下分析之前,我們有幾個概念需要先了解下:

1、鎖定讀和一致性非鎖定讀

鎖定讀:在一個事務中,主動給讀加鎖,如SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE。分別加上了行共享鎖和行排他鎖。鎖的分類可見我以前的分析文章:你應該了解的MySQL鎖分類)。

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

一致性非鎖定讀:InnoDB使用MVCC向事務的查詢提供某個時間點的數據庫快照。查詢會看到在該時間點之前提交的事務所做的更改,而不會看到稍后或未提交的事務所做的更改(本事務除外)。也就是說在開始了事務之后,事務看到的數據就都是事務開啟那一刻的數據了,其他事務的后續修改不會在本次事務中可見。

Consistent read是InnoDB在RC和RR隔離級別處理SELECT語句的默認模式。一致性非鎖定讀不會對其訪問的表設置任何鎖,因此,在對表執行一致性非鎖定讀的同時,其它事務可以同時并發的讀取或者修改它們。

https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html

2、當前讀和快照讀

當前讀

讀取的是最新版本,像UPDATE、DELETE、INSERT、SELECT ...  LOCK IN SHARE MODE、SELECT ... FOR UPDATE這些操作都是一種當前讀,為什么叫當前讀?就是它讀取的是記錄的最新版本,讀取時還要保證其他并發事務不能修改當前記錄,會對讀取的記錄進行加鎖。

快照讀

讀取的是快照版本,也就是歷史版本,像不加鎖的SELECT操作就是快照讀,即不加鎖的非阻塞讀;快照讀的前提是隔離級別不是未提交讀和序列化讀級別,因為未提交讀總是讀取最新的數據行,而不是符合當前事務版本的數據行,而序列化讀則會對表加鎖。

3、隱式鎖定和顯式鎖定

隱式鎖定

InnoDB在事務執行過程中,使用兩階段鎖協議(不主動進行顯示鎖定的情況):

  • 隨時都可以執行鎖定,InnoDB會根據隔離級別在需要的時候自動加鎖;
  • 鎖只有在執行commit或者rollback的時候才會釋放,并且所有的鎖都是在同一時刻被釋放。

顯式鎖定

  • InnoDB也支持通過特定的語句進行顯示鎖定(存儲引擎層)
select ... lock in share mode //共享鎖
select ... for update //排他鎖
  • MySQL Server層的顯示鎖定:
lock table
unlock table

了解完上面的概念后,我們來看下InnoDB的事務具體是怎么實現的(下面的讀都指的是非主動加鎖的select)

事務隔離級別    實現方式                                                     
未提交讀(RU) 事務對當前被讀取的數據不加鎖,都是當前讀;

事務在更新某數據的瞬間(就是發生更新的瞬間),必須先對其加行級共享鎖,直到事務結束才釋放。
提交讀(RC)    事務對當前被讀取的數據不加鎖,且是快照讀;

事務在更新某數據的瞬間(就是發生更新的瞬間),必須先對其加行級排他鎖(Record),直到事務結束才釋放。

通過快照,在這個級別MySQL就解決了不可重復讀的問題
可重復讀(RR) 事務對當前被讀取的數據不加鎖,且是快照讀;

事務在更新某數據的瞬間(就是發生更新的瞬間),必須先對其加行級排他鎖(Record,GAP,Next-Key),直到事務結束才釋放。

通過間隙鎖,在這個級別MySQL就解決了幻讀的問題
序列化讀(S)   事務在讀取數據時,必須先對其加表級共享鎖 ,直到事務結束才釋放,都是當前讀;

事務在更新數據時,必須先對其加表級排他鎖 ,直到事務結束才釋放。

可以看到,InnoDB通過MVCC很好的解決了讀寫沖突的問題,而且提前一個級別就解決了標準級別下會出現的幻讀和不可重復讀問題,大大提升了數據庫的并發能力。

一些常見誤區

幻讀到底包不包括了delete的情況?

不可重復讀:前后多次讀取一行,數據內容不一致,針對其他事務的update和delete操作。為了解決這個問題,使用行共享鎖,鎖定到事務結束(也就是RR級別,當然MySQL使用MVCC在RC級別就解決了這個問題)

幻讀:當同一個查詢在不同時間生成不同的行集合時就是出現了幻讀,針對的是其他事務的insert操作,為了解決這個問題,鎖定整個表到事務結束(也就是S級別,當然MySQL使用間隙鎖在RR級別就解決了這個問題)

網上很多文章提到幻讀和提交讀的時候,有的說幻讀包括了delete的情況,有的說delete應該屬于提交讀的問題,那到底真相如何呢?我們實際來看下MySQL的官方文檔(如下)

The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a SELECT) is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.
https://dev.mysql.com/doc/refman/5.7/en/innodb-next-key-locking.html

可以看到,幻讀針對的是結果集前后發生變化,所以看起來delete的情況應該歸為幻讀,但是我們實際分析下上面列出的標準SQL在RR級別的實現原理就知道,標準SQL的RR級別是會對查到的數據行加行共享鎖,所以這時候其他事務想刪除這些數據行其實是做不到的,所以在RR下,不會出現因delete而出現幻讀現象,也就是幻讀不包含delete的情況。

MVCC能解決了幻讀問題?

網上很多文章會說MVCC或者MVCC+間隙鎖解決了幻讀問題,實際上MVCC并不能解決幻讀問題。如以下的例子:

begin;

#假設users表為空,下面查出來的數據為空

select * from users; #沒有加鎖

#此時另一個事務提交了,且插入了一條id=1的數據

select * from users; #讀快照,查出來的數據為空

update users set name='mysql' where id=1;#update是當前讀,所以更新成功,并生成一個更新的快照

select * from users; #讀快照,查出來id為1的一條記錄,因為MVCC可以查到當前事務生成的快照

commit;

可以看到前后查出來的數據行不一致,發生了幻讀。所以說只有MVCC是不能解決幻讀問題的,解決幻讀問題靠的是間隙鎖。如下:

begin;

#假設users表為空,下面查出來的數據為空

select * from users lock in share mode; #加上共享鎖

#此時另一個事務B想提交且插入了一條id=1的數據,由于有間隙鎖,所以要等待

select * from users; #讀快照,查出來的數據為空

update users set name='mysql' where id=1;#update是當前讀,由于不存在數據,不進行更新

select * from users; #讀快照,查出來的數據為空

commit;

#事務B提交成功并插入數據

注意,RR級別下想解決幻讀問題,需要我們顯式加鎖,不然查詢的時候還是不會加鎖的

以上就是詳解MySQL中事務隔離級別的實現原理的詳細內容,更多關于MySQL 事務隔離級別的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • mysql在項目中怎么選事務隔離級別
  • MySql學習筆記之事務隔離級別詳解
  • mysql、oracle默認事務隔離級別的說明
  • 簡述MySql四種事務隔離級別
  • Mysql案例刨析事務隔離級別

標簽:隨州 黑河 甘南 荊州 錦州 滄州 吉林 資陽

巨人網絡通訊聲明:本文標題《詳解MySQL中事務隔離級別的實現原理》,本文關鍵詞  詳解,MySQL,中,事務,隔離,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解MySQL中事務隔離級別的實現原理》相關的同類信息!
  • 本頁收集關于詳解MySQL中事務隔離級別的實現原理的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一区二区在线观看视频| 国产毛片精品国产一区二区三区| 在线观看精品一区| 成人综合婷婷国产精品久久免费| 首页亚洲欧美制服丝腿| 一区二区三区波多野结衣在线观看 | 色婷婷激情久久| 国产精品99久久久久久宅男| 亚洲精品第1页| 中文字幕在线观看一区| 中文字幕+乱码+中文字幕一区| 欧美激情艳妇裸体舞| 中文字幕永久在线不卡| 亚洲精品欧美激情| 日本怡春院一区二区| 国产在线精品一区二区夜色| 东方欧美亚洲色图在线| 色综合久久久久综合体| 欧美久久高跟鞋激| 国产日本欧美一区二区| 香蕉成人伊视频在线观看| 亚洲成a人片在线观看中文| 美国欧美日韩国产在线播放| 国产精品18久久久久久久久 | 制服丝袜亚洲网站| 亚洲精品一区二区三区香蕉| 国产精品成人免费| 日韩精品乱码免费| 国产精品一二三| 欧美亚一区二区| 久久久久久久久久久久电影 | 欧美午夜视频网站| 26uuu国产在线精品一区二区| 国产精品不卡在线| 美国精品在线观看| 99精品久久免费看蜜臀剧情介绍| 欧美男同性恋视频网站| 国产精品人妖ts系列视频| 亚洲二区在线观看| 丁香网亚洲国际| 欧美日韩日日夜夜| 亚洲国产精品二十页| 日本亚洲视频在线| 一本色道久久综合狠狠躁的推荐| 欧美成人女星排名| 亚洲影视资源网| 菠萝蜜视频在线观看一区| 91麻豆精品国产91久久久| 国产精品久久久久久福利一牛影视 | 欧美男生操女生| 日韩理论在线观看| 懂色av一区二区三区蜜臀| 日韩三级高清在线| 亚洲h在线观看| 91免费看`日韩一区二区| 日本一区二区三区四区| 日韩精品欧美精品| 欧美日韩一本到| 一区二区三区日韩精品| 99久久国产综合色|国产精品| 久久精品人人做人人综合| 青娱乐精品视频在线| 欧美日韩一区二区欧美激情 | 国产成人福利片| 在线播放一区二区三区| 一区二区久久久久| 97久久精品人人做人人爽| 国产精品欧美一区二区三区| 美国欧美日韩国产在线播放| 日韩欧美国产综合一区 | 日韩av不卡在线观看| 欧美少妇性性性| 亚洲美女电影在线| 一本色道久久综合亚洲91| 亚洲视频你懂的| 99re66热这里只有精品3直播| 国产精品麻豆视频| av网站一区二区三区| 中文字幕乱码久久午夜不卡 | 欧美乱妇23p| 亚洲一区二区成人在线观看| 欧美在线观看禁18| 亚洲电影中文字幕在线观看| 欧美日韩精品欧美日韩精品| 无吗不卡中文字幕| 日韩女优毛片在线| 国产一区二区在线影院| 久久久精品国产99久久精品芒果 | 韩国精品主播一区二区在线观看| 欧美mv和日韩mv国产网站| 国产一区二区三区在线观看精品| 欧美一区二区三区白人| 久久精品国产在热久久| 欧美国产一区二区在线观看| jlzzjlzz亚洲日本少妇| 亚洲成人av电影在线| 欧美不卡在线视频| 国产成人精品网址| 一区二区三区成人| 日韩精品一区二区三区视频播放| 国产成人免费视频一区| 亚洲一区影音先锋| 久久亚洲精精品中文字幕早川悠里| bt欧美亚洲午夜电影天堂| 亚洲激情自拍视频| 亚洲精品一区二区在线观看| 色噜噜狠狠色综合中国| 美女高潮久久久| 亚洲精品一卡二卡| 久久精品视频一区二区三区| 欧美日韩中文精品| 国产激情一区二区三区桃花岛亚洲| 亚洲激情av在线| 久久精品一级爱片| 欧美群妇大交群的观看方式| 福利电影一区二区| 美腿丝袜亚洲三区| 亚洲视频一区在线| 精品久久国产97色综合| 在线观看区一区二| 国产99久久久国产精品| 婷婷中文字幕综合| 国产精品美女久久久久aⅴ国产馆| 欧美一区二区在线免费观看| 色婷婷综合久久久久中文| 懂色一区二区三区免费观看| 蜜桃av一区二区三区电影| 亚洲午夜一区二区| 亚洲欧美激情在线| 国产精品久久毛片av大全日韩| 日韩一区二区免费电影| 欧美在线观看一区| 91丨九色丨尤物| 国产不卡在线一区| 精品在线播放午夜| 日本一道高清亚洲日美韩| 亚洲国产视频网站| 一区av在线播放| 一区二区三区在线观看网站| 综合亚洲深深色噜噜狠狠网站| 久久精品视频免费观看| 久久久午夜精品理论片中文字幕| 欧美电影免费观看高清完整版在线观看| 91视频免费观看| 色婷婷综合久色| 91视频精品在这里| 91激情五月电影| 欧美亚洲动漫精品| 欧美另类videos死尸| 7777精品伊人久久久大香线蕉最新版| 91福利国产精品| 欧美色视频在线| 欧美日韩国产片| 日韩午夜电影av| 久久青草国产手机看片福利盒子| 久久色视频免费观看| 久久久久国产免费免费| 国产精品网站在线观看| 亚洲精品乱码久久久久久| 一区二区三区不卡视频| 日韩激情av在线| 国内成人免费视频| 成人福利视频在线看| 色www精品视频在线观看| 欧美在线免费观看亚洲| 91精品国产入口在线| 国产性做久久久久久| 亚洲另类春色国产| 丝瓜av网站精品一区二区 | 日韩一二三四区| 国产欧美一区二区三区在线老狼| 18欧美乱大交hd1984| 日韩不卡一区二区| 高清不卡在线观看| 欧美男人的天堂一二区| 久久精品亚洲一区二区三区浴池| 亚洲同性同志一二三专区| 日日夜夜精品免费视频| 国产91精品久久久久久久网曝门| 91在线国产福利| 精品久久一区二区三区| 亚洲精品成人悠悠色影视| 久久福利资源站| 91久久精品网| 国产视频一区在线播放| 日韩国产欧美三级| 99re热这里只有精品免费视频| 欧美日本视频在线| 日韩毛片高清在线播放| 国产一区二区三区精品视频| 欧美中文字幕一区| 欧美激情艳妇裸体舞| 美女视频黄久久| 欧美日韩激情在线| 中文字幕制服丝袜一区二区三区| 日本不卡不码高清免费观看| 色婷婷av一区二区三区大白胸| 亚洲精品一区二区三区蜜桃下载| 亚洲图片欧美色图| 99久久综合色|