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

主頁 > 知識庫 > MySQL如何實現事務的ACID

MySQL如何實現事務的ACID

熱門標簽:許昌外呼增值業務線路 石家莊400電話辦理公司 申請400電話電話價格 臨沂做地圖標注 廣東400企業電話申請流程 地圖標注客戶付款 咸陽防封電銷卡 宜賓全自動外呼系統廠家 新鄉智能外呼系統好處

前言

最近在面試,有被問到,MySQL的InnoDB引擎是如何實現事務的,又或者說是如何實現ACID這幾個特性的,當時沒有答好,所以自己總結出來,記錄一下。

事務的四大特性ACID

事務的四大特性ACID分別是,A-原子性(Atomicity),C-一致性(Consistency),I-隔離性(Isolation),D-持久性(Durability)。一致性是最終目的,原子性、隔離性、持久性是為了保證一致性所做的措施。所以我寫的順序并不是按照ACID來寫的,將一致性放到了最后,順序就變成了,ADIC。

原子性(A)

原子性是指一個事務就是一個不可分割的工作單位,要么全部都執行成功,要么全部都執行失敗,沒有中間狀態或是只執行一部分。

MySQL的InnoDB引擎是靠undo log(回滾日志)來實現的,undo log能夠保證在事務回滾時,能夠撤銷所有已經執行成功的SQL。

undo log 屬于邏輯日志,它記錄的是SQL執行相關的信息。當事務對數據庫進行修改時,InnoDB會生成與之對應的undo log。如果事務執行失敗或者調用的rollback,導致事務需要回滾,InnoDB引擎會根據undo log中的記錄,將數據回滾到之前的樣子。
例如在執行insert語句時會生成相關的delete語句的undo log。反之執行delete語句也會生成相關的insert語句的undo log。執行update語句時也是如此,不過update語句在執行undo log回滾時有可能會涉及到MVCC。主要是為了保證在執行undo log的時候的select能看到哪個版本的數據。

持久性(D)

持久性是指事務一旦提交,對數據庫的操作就是永久性的,接下來的其他操作和異常故障不應該對它有任何影響。
我們都知道MySQL的數據最終是存放在磁盤中的,所以才會有磁盤的容量大小決定數據容量的大小。但是如果對MySQL的操作都是通過讀寫磁盤來進行的話,那么光是磁盤的I/O就夠把效率大大的拉低了。

所以InnoDB為MySQL提供了緩沖池(Buffer Pool),Buffer Pool中包含了磁盤中部分數據頁的映射。
當從數據庫讀取數據時,會先從Buffer Pool中讀取數據,如果Buffer Pool中沒有,則從磁盤讀取后放入到Buffer Pool中。
當向數據庫寫入數據時,會先寫入到Buffer Pool中,Buffer Pool中更新的數據會定期刷新到磁盤中(此過程稱為刷臟)。

雖然Buffer Pool為MySQL的讀寫提高了效率,但是卻也帶來了新的問題,那就是如果數據剛更新到Buffer Pool中還沒來得及刷新到磁盤中時,MySQL突然宕機了,這就會導致數據丟失,造成事務的持久性無法保證了。
為了解決這個緩存的一致性問題,redo log就出現了。在對Buffer Pool中的數據進行修改的時候通過redo log記錄這次操作,當事務提交時會通過fsync接口對redo log進行刷盤。

因為在事務提交時會把redo log是同步在磁盤中的,所以當MySQL出現宕機時,可以從磁盤中讀取redo log進行數據的恢復,從而保證了事務的持久性。

redo log 采用的預寫的方式記錄日志,即先記錄日志,再更新Buffer Pool,這樣就強行的保證了,數據只要保存在了redo log中就一定會存儲到磁盤中了。

這要解釋一下,redo log 也是寫磁盤,刷臟也是寫磁盤,為啥要先記錄redo log而不是直接刷臟?

主要原因就是redo log比刷臟快很多。

第一點是,redo log是追加操作日志,是順序IO;而刷臟是隨機IO,因為每次更新的數據不一定是挨著的,也就是隨機的。

第二點是,刷臟是以數據頁(Page)為單位的(即每次最少從磁盤中讀取一頁數據到內存,或者最少刷一頁數據到磁盤),MySQL默認頁大小是16KB,對一個頁上的修改,都要整個頁都刷到磁盤中;而redo log只包含真正的需要寫入磁盤的操作日志。

MySQL還有一個記錄操作的日志,叫binlog ,那么redo log和binlog又有什么區別呢?

  • 第一點作用上的區別:

redo log是用來記錄更新緩存的,為了保證MySQL就算宕機也不會影響事務的持久性;binlog是用來記錄什么時間操作了什么,主要有時間點,可以保證將數據恢復到某個時間點,也有用于主從同步數據的。

  • 第二點層次上的區別:

redo log是存儲引擎InnoDB實現的(MyISAM就沒有redo log),而binlog是在MySQL服務器層面存在的任何其他存儲引擎也有binlog。
存儲內容上,redo log是物理日志,基于磁盤的數據頁,binlog是邏輯日志,存儲的一條執行SQL。

  • 第三點寫入時機的區別:

redo log 在默認情況下是在事務提交時,進行刷盤的;可以通過參數:innodb_flush_log_at_trx_commit 來改變策略,可以不用等到事務提交時才進行刷盤。
如:可以設置成每秒提交一次。
binlog是在事務提交時寫入。

隔離性(I)

原子性和持久性都是基于單個事務內部的措施,而隔離性是只多個事務之間相互隔離,互不影響的特性。
我們都知道事務的隔離級別中最嚴謹的是串行化(Serializable),但是隔離性越高,性能就越低,所以一般不使用串行化這個隔離級別。
對于隔離性的,我們要分兩種情況進行討論:

  • 一個事務中的寫操作對另一個事務中的寫操作的影響;
  • 一個事務中的寫操作對另一個事務中的讀操作的影響;

首先,事務間的寫操作其實是靠MySQL的鎖機制來實現隔離的,而事務間的寫和讀操作是靠MVCC機制來實現的。

鎖機制

MySQL中的鎖主要有

按照功能分:讀鎖和寫鎖;按照作用范圍分:表級鎖和行級鎖;
還有意向鎖,間隙鎖等。

讀鎖:又稱“共享鎖”,是指多個事務可以共享一把鎖,都只能訪問數據,并不能修改。

寫鎖:又稱“排他鎖”,是不能和其他事務共享數據的,如果一個事務獲取到了一個數據的排他鎖,那么其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖。

表級鎖:是指會將整個表進行鎖定,性能較差,不同存儲引擎支持的鎖的粒度不同,MyISAM引擎支持表級鎖,InnoDB引擎支持表級鎖也支持行級鎖。

行級鎖:會將需要操作的相應行進行鎖定,性能好。

意向鎖:意向鎖是表級鎖,如果在一個事務已經對一個表中的某個數據加上了排他鎖或共享鎖,那么就可以加上意向鎖,這樣當下一個事務來進行鎖表的時候發現已經存在意向鎖了,就會先被阻塞,如果不加意向鎖的話,第二個事務來鎖表的時候需要一行一行的遍歷查看是否有數據已經被鎖住了。

間隙鎖:間隙鎖是為了防止產生幻讀而加的鎖,加在不存在的空閑空間,可以是兩個索引記錄之間,也可能是第一個索引記錄之前或最后一個索引之后的空間(但是并不包含當前記錄)。這樣就保證了在間隙鎖執行的時候,新增的數據會阻塞,保證了一個事務中的兩次查詢獲得的記錄數都是一致的。

Next-Key Lock:Next-Key Lock是行級鎖和間隙鎖的結合產生的鎖,因為間隙鎖是不會鎖住當前記錄的而Next-Key Lock是會將當前記錄也鎖住的。

例如:如果一個表中有三條數據分別是:

id name number
1 小明 16
2 小紅 17
3 小張 20
4 小王 20

那么在執行SQL:select * from table where number = 17 for update 時間隙鎖會鎖住,number的區間是(16,17),(17,20),但是Next-Key Lock的鎖住的是:
16,17),(17,20)區間加間隙鎖,同時number=17加記錄鎖。

鎖機制保障了多個事務間的寫操作的隔離,而多個事務間的讀和寫操作的保證是需要通過MVCC機制來保證的。

MVCC機制

MVCC全稱是【Multi-Version ConCurrency Control】即多版本控制協議。

MVCC的主要是靠在每行記錄上增加隱藏列和使用undo log來實現的,隱藏列主要包括,改行數據創建的版本號(遞增的),刪除時間,指向undo log的指針等。

那么MVCC是如何保證讀寫隔離的呢?主要是通過快照讀和當前讀兩個操作。

  • 快照讀:

MVCC為了保證并發的效率,在進行讀取數據的時候是不加鎖的,在執行select的時候(不帶鎖的普通select),會先讀取當前數據的版本號,如果在select還沒返回結果時,有事務將此行數據進行了修改,那么版本號就會比執行select的時候的大,所以為了保證select讀取數據的一致性,就只會讀取小于或等于當前版本的數據,這個歷史版本的數據就是從undo log中獲取到的。

  • 當前讀:

當執行insert、update、delete的時候,是讀取的當前最新的版本數據,并且會給當前記錄加上鎖,用來保證在操作的時候不會被別的事務將版本號進行修改。

像普通的select就是快照讀即讀取的有可能就是數據的歷史版本。

insert、update、delete、select ... lock in share mode 和select ... for update 讀取的就是當前讀,即讀取的都是數據的最新版本。

其實將隔離級別設置為Serializable也是可以實現讀寫隔離的,但是并發效率會比低很多,所以一般用的很少,但是MVCC是讀不加鎖的,只有在寫的時候才會加鎖,從而提高的并發的效率。

通過MVCC機制保證了多個事務間的讀寫隔離,從而實現了事務的隔離性。

一致性(C)

一致性是指在事務執行前后,數據的一致性,事務前后數據完整性沒有破壞,并且都是合法的數據狀態。

  • 其中一致性的指標有:

索引的完整(唯一索引,不重復等),數據列的完成(字段類型,長度,大小符合要求),外鍵約束等。

  • 實現一致性的措施:

保證原子性,持久性,隔離性,如果這些特性都無法保證,那么一致性就也無法保證了。從數據庫層面來看,除了前面那幾個特性的保證外,對字段的一致性是有保證措施的,例如整型的字符不能傳入,字符串、時間等格式,字符串的長度不能超過列的限制。但是在應用層面也是需要開發者自己來保證的,
例如:從A轉賬給B一部分金額,那么就要保證,從A從將金額扣除多少就要去給B增加多少金額,如果只扣除A的金額,而沒有增加B的金額,是無法保證一致性的。

另外,MySQL還通過兩階段提交事務,保證了redo log和binlog之間的數據一致性問題。

通過上面介紹持久性的時候解釋了,redo log和binlog的區別了,在區別中的第三條有說到,在默認情況下,事務提交時,既寫redo log 有寫binlog那么他們是如何協調一致性的呢?事務提交成功以寫入哪個日志為準呢?
MySQL通過兩階段提交來保證這兩個日志的數據一致性。

  • 第一階段提交,

將redo log提交到磁盤,并將狀態改為prepare狀態,binlog不做任何操作。

  • 第二階段提交,

1、生成事務操作的binlog,并將binlog寫入到磁盤中。

2、調用引擎的提交事務接口,將redo log的狀態從prepare改為commit,事務提交完成。
通過上面這兩階段提交保證了事務數據的一致性。
當事務提交時redo log處于prepare階段時,發生MySQL宕機或崩潰,則會執行事務回滾。
當事務提交redo log處于commit階段時,發生了崩潰會執行事務恢復,本機事務通過redol og進行恢復,而如果是主從數據庫的話,在commit階段,會根據binlog對從庫進行數據恢復。
這就是以寫入binlog成功為提交事務成功的依據。因為一般在崩潰恢復的時候都是用binlong進行恢復的,如果還未生成binlog,只寫入了redo log。在恢復的時候redo log恢復的是一個版本的數據,而通過bin log恢復的從庫數據會是之前的一個時間點的binlog版本的數據,這樣數據就導致不一致了。

總結

MySQL事務的ACID,一致性是最終目的。
保證一致性的措施有:

  • A原子性:靠undo log來保證(異常或執行失敗后進行回滾)。
  • D持久性:靠redo log來保證(保證當MySQL宕機或停電后,可以通過redo log最終將數據保存至磁盤中)。
  • I隔離性:事務間的讀寫靠MySQL的鎖機制來保證隔離,事務間的寫操作靠MVCC機制(快照讀、當前讀)來保證隔離性。
  • C一致性:事務的最終目的,即需要數據庫層面保證,又需要應用層面進行保證,并且MySQL底層通過兩階段提交事務保證了事務持久化時的一致性。

以上就是MySQL如何實現事務的ACID的詳細內容,更多關于MySQL實現事務的ACID的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Mysql中事務ACID的實現原理詳解
  • MySQL令人大跌眼鏡的隱式轉換
  • MySQL非空約束(not null)案例講解
  • 解決mysql數據庫數據遷移達夢數據亂碼問題
  • MySQL連接異常報10061錯誤問題解決
  • MySQL事務控制流與ACID特性

標簽:阜新 合肥 貴州 臺灣 鎮江 北京 鷹潭 日照

巨人網絡通訊聲明:本文標題《MySQL如何實現事務的ACID》,本文關鍵詞  MySQL,如何,實現,事務,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL如何實現事務的ACID》相關的同類信息!
  • 本頁收集關于MySQL如何實現事務的ACID的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    色婷婷av一区二区三区gif | 精品一区二区三区av| 国产酒店精品激情| 亚洲欧美综合在线精品| 国产精品久久久一区麻豆最新章节| 久久精品夜色噜噜亚洲a∨| 丰满少妇久久久久久久| 国产精品卡一卡二| 亚洲精品国产第一综合99久久 | 色欧美日韩亚洲| 亚洲国产精品自拍| 中文在线一区二区| 欧美一区二区三区四区高清| 成人av在线播放网站| 91久久奴性调教| 国产成人精品一区二区三区网站观看| 日韩一区欧美一区| 国产欧美精品一区二区三区四区 | 日韩美女视频在线| 国产亚洲精品中文字幕| 中文字幕一区二| 久久99精品国产麻豆婷婷洗澡| 国产综合久久久久久久久久久久 | 一区二区三区四区亚洲| 亚洲mv在线观看| 国产揄拍国内精品对白| 99久久免费精品高清特色大片| 日韩视频永久免费| 亚洲人妖av一区二区| 久久99久久久久久久久久久| 成人国产在线观看| 国产三级一区二区三区| 亚洲观看高清完整版在线观看| 激情综合色播激情啊| 欧洲一区二区av| 中文字幕永久在线不卡| 久久不见久久见免费视频1| 国产盗摄一区二区| 91精品国产综合久久久久久久久久 | 国产精品国产三级国产a| 亚洲最大成人网4388xx| 亚洲视频在线一区观看| 亚洲精品中文在线影院| av中文字幕亚洲| 亚洲男同1069视频| 91精品福利在线一区二区三区| 五月天亚洲精品| 欧美不卡123| 成人性生交大片免费| 一区二区视频在线看| 欧美一区二区三区播放老司机| 免费看黄色91| 国产精品污www在线观看| 97超碰欧美中文字幕| 欧美经典一区二区三区| 久久国产欧美日韩精品| 69久久夜色精品国产69蝌蚪网| 久久蜜桃香蕉精品一区二区三区| 亚洲第一激情av| 亚洲精品综合在线| 欧美精品一区二区三区在线| 91麻豆精品国产91久久久资源速度| 在线观看三级视频欧美| 91国偷自产一区二区三区成为亚洲经典 | 久久精品二区亚洲w码| 国产精品国产自产拍高清av王其| 国产精品高清亚洲| av在线综合网| 成人欧美一区二区三区黑人麻豆 | 日本在线不卡视频| 欧美一级高清大全免费观看| 国产电影一区二区三区| 欧美日韩精品高清| 日韩成人dvd| 久久蜜桃香蕉精品一区二区三区| 精品一区二区影视| 久久久精品蜜桃| 91美女片黄在线观看91美女| 国产精品理论在线观看| 欧美性极品少妇| 国产一区二区精品在线观看| 亚洲欧美影音先锋| 精品国产91洋老外米糕| 欧美日韩一区小说| 在线免费观看日本一区| 国产成人h网站| 国产成人综合亚洲网站| 日韩一区二区三区精品视频| 成人免费视频免费观看| 久久精品国产99| 午夜伦欧美伦电影理论片| 国产精品三级在线观看| 日韩色在线观看| 91原创在线视频| 色婷婷综合激情| 91在线码无精品| 欧美日本在线播放| 欧美一激情一区二区三区| 日韩欧美国产高清| 在线欧美一区二区| 日韩精品视频网站| 精品美女被调教视频大全网站| 欧美激情综合在线| 国产成人精品www牛牛影视| 成人午夜精品一区二区三区| 日本色综合中文字幕| 日韩黄色在线观看| 成人夜色视频网站在线观看| 美脚の诱脚舐め脚责91| 国产一区二区三区久久久| 高清成人在线观看| 欧美日韩第一区日日骚| 日本一区二区三区在线不卡| 亚洲欧洲制服丝袜| 91丨九色丨尤物| 欧美亚洲动漫精品| 色综合天天综合狠狠| 欧美日韩国产一二三| 337p亚洲精品色噜噜狠狠| 日韩一区二区三免费高清| 国产免费久久精品| 五月天久久比比资源色| 成人精品视频一区二区三区| 精品成人私密视频| 青青草精品视频| 91精品国产色综合久久不卡电影 | 五月激情六月综合| 国产成人午夜精品影院观看视频 | 国产主播一区二区三区| 亚洲成av人片一区二区| 午夜精品在线看| 欧美视频精品在线| 日韩激情av在线| 国产亚洲一区二区三区在线观看 | 欧美精品一区二区三区久久久| 丝袜美腿亚洲综合| 91精品国产色综合久久久蜜香臀| 亚洲蜜臀av乱码久久精品| 亚洲一区免费视频| 欧美网站大全在线观看| 亚洲精品网站在线观看| 91亚洲国产成人精品一区二区三| 91精品福利在线一区二区三区| 亚洲综合色在线| 欧美乱妇23p| 极品尤物av久久免费看| 久久嫩草精品久久久精品| 精品一区二区在线观看| 亚洲色图丝袜美腿| 日韩一级欧美一级| 欧美性视频一区二区三区| 久久精品噜噜噜成人av农村| 亚洲欧洲av色图| 色综合久久久久久久| 一区二区三区在线观看欧美| 欧美日韩二区三区| 狠狠色狠狠色合久久伊人| 亚洲精品福利视频网站| 制服丝袜亚洲播放| 99久久99久久综合| 成人福利视频网站| 亚洲免费成人av| 欧美精品色综合| 日韩av在线播放中文字幕| kk眼镜猥琐国模调教系列一区二区 | 亚洲美女免费在线| 玉米视频成人免费看| 亚洲欧美另类久久久精品| 91精品黄色片免费大全| 91成人看片片| av一区二区三区| 91免费看片在线观看| 日韩av电影一区| 亚洲激情第一区| 亚洲免费在线视频一区 二区| 国产精品高潮呻吟久久| 日韩一区欧美小说| 午夜av一区二区| 久久激五月天综合精品| 亚洲国产精品久久不卡毛片 | 亚洲色图清纯唯美| 成人欧美一区二区三区白人| 欧美成人午夜电影| 国产三级一区二区| 亚洲男人都懂的| 久久精品国产成人一区二区三区| 国产一区亚洲一区| 岛国一区二区在线观看| 欧美日韩一区在线| 久久色在线视频| 一区二区免费视频| 五月天丁香久久| 国产一区 二区 三区一级| 粗大黑人巨茎大战欧美成人| 91亚洲国产成人精品一区二三 | 欧美在线免费视屏| 欧美国产国产综合| 亚洲电影你懂得| 亚洲成人免费影院| 国产激情91久久精品导航|