校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Mysql中事務(wù)ACID的實現(xiàn)原理詳解

Mysql中事務(wù)ACID的實現(xiàn)原理詳解

熱門標簽:電話機器人的價格多少錢一個月 中國地圖標注公司 福建外呼電銷機器人加盟 百度地圖標注要什么軟件 400電話申請廠家現(xiàn)貨 昌德訊外呼系統(tǒng) 徐涇鎮(zhèn)騰訊地圖標注 自己做地圖標注需要些什么 天津公司外呼系統(tǒng)軟件

引言

照例,我們先來一個場景~

面試官:"知道事務(wù)的四大特性么?"
你:"懂,ACID嘛,原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)!"
面試官:"你們是用mysql數(shù)據(jù)庫吧,能簡單說說innodb中怎么實現(xiàn)這四大特性的么?“
你:"我只知道隔離性是怎么做的balabala~~"
面試官:"還是回去等通知吧~"

OK,回到正題。說到事務(wù)的四大特性原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),懂的人很多。但是稍微涉及細節(jié)一點,這四大特性在數(shù)據(jù)庫中的實現(xiàn)原理是怎么樣的?那就沒有幾個人能夠答得上來了。因此,我們這篇文章著重討論一下四大特性在Mysql中的實現(xiàn)原理。

正文

我們以從A賬戶轉(zhuǎn)賬50元到B賬戶為例進行說明一下ACID,四大特性。

原子性

根據(jù)定義,原子性是指一個事務(wù)是一個不可分割的工作單位,其中的操作要么都做,要么都不做。即要么轉(zhuǎn)賬成功,要么轉(zhuǎn)賬失敗,是不存在中間的狀態(tài)!

如果無法保證原子性會怎么樣?

OK,就會出現(xiàn)數(shù)據(jù)不一致的情形,A賬戶減去50元,而B賬戶增加50元操作失敗。系統(tǒng)將無故丟失50元~

隔離性

根據(jù)定義,隔離性是指多個事務(wù)并發(fā)執(zhí)行的時候,事務(wù)內(nèi)部的操作與其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。

如果無法保證隔離性會怎么樣?

OK,假設(shè)A賬戶有200元,B賬戶0元。A賬戶往B賬戶轉(zhuǎn)賬兩次,金額為50元,分別在兩個事務(wù)中執(zhí)行。如果無法保證隔離性,會出現(xiàn)下面的情形


如圖所示,如果不保證隔離性,A扣款兩次,而B只加款一次,憑空消失了50元,依然出現(xiàn)了數(shù)據(jù)不一致的情形!

ps:可能有細心的讀者已經(jīng)發(fā)現(xiàn)了,mysql中是依靠鎖來解決隔離性問題。嗯,我們后面來說明。

持久性

根據(jù)定義,持久性是指事務(wù)一旦提交,它對數(shù)據(jù)庫的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其有任何影響。

如果無法保證持久性會怎么樣?

在Mysql中,為了解決CPU和磁盤速度不一致問題,Mysql是將磁盤上的數(shù)據(jù)加載到內(nèi)存,對內(nèi)存進行操作,然后再回寫磁盤。好,假設(shè)此時宕機了,在內(nèi)存中修改的數(shù)據(jù)全部丟失了,持久性就無法保證。

設(shè)想一下,系統(tǒng)提示你轉(zhuǎn)賬成功。但是你發(fā)現(xiàn)金額沒有發(fā)生任何改變,此時數(shù)據(jù)出現(xiàn)了不合法的數(shù)據(jù)狀態(tài),我們將這種狀態(tài)認為是數(shù)據(jù)不一致的情形。

一致性

根據(jù)定義,一致性是指事務(wù)執(zhí)行前后,數(shù)據(jù)處于一種合法的狀態(tài),這種狀態(tài)是語義上的而不是語法上的。
那什么是合法的數(shù)據(jù)狀態(tài)呢?

oK,這個狀態(tài)是滿足預(yù)定的約束就叫做合法的狀態(tài),再通俗一點,這狀態(tài)是由你自己來定義的。滿足這個狀態(tài),數(shù)據(jù)就是一致的,不滿足這個狀態(tài),數(shù)據(jù)就是不一致的!

如果無法保證一致性會怎么樣?

例一:A賬戶有200元,轉(zhuǎn)賬300元出去,此時A賬戶余額為-100元。你自然就發(fā)現(xiàn)了此時數(shù)據(jù)是不一致的,為什么呢?因為你定義了一個狀態(tài),余額這列必須大于0。

例二:A賬戶200元,轉(zhuǎn)賬50元給B賬戶,A賬戶的錢扣了,但是B賬戶因為各種意外,余額并沒有增加。你也知道此時數(shù)據(jù)是不一致的,為什么呢?因為你定義了一個狀態(tài),要求A+B的余額必須不變。

實戰(zhàn)解答

問題一:Mysql怎么保證一致性的?

OK,這個問題分為兩個層面來說。

從數(shù)據(jù)庫層面,數(shù)據(jù)庫通過原子性、隔離性、持久性來保證一致性。也就是說ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔離性)、D(持久性)是手段,是為了保證一致性,數(shù)據(jù)庫提供的手段。數(shù)據(jù)庫必須要實現(xiàn)AID三大特性,才有可能實現(xiàn)一致性。例如,原子性無法保證,顯然一致性也無法保證。

但是,如果你在事務(wù)里故意寫出違反約束的代碼,一致性還是無法保證的。例如,你在轉(zhuǎn)賬的例子中,你的代碼里故意不給B賬戶加錢,那一致性還是無法保證。因此,還必須從應(yīng)用層角度考慮。

從應(yīng)用層面,通過代碼判斷數(shù)據(jù)庫數(shù)據(jù)是否有效,然后決定回滾還是提交數(shù)據(jù)!

問題二: Mysql怎么保證原子性的?

OK,是利用Innodb的undo log。

undo log名為回滾日志,是實現(xiàn)原子性的關(guān)鍵,當事務(wù)回滾時能夠撤銷所有已經(jīng)成功執(zhí)行的sql語句,他需要記錄你要回滾的相應(yīng)日志信息。

例如

  • (1)當你delete一條數(shù)據(jù)的時候,就需要記錄這條數(shù)據(jù)的信息,回滾的時候,insert這條舊數(shù)據(jù)
  • (2)當你update一條數(shù)據(jù)的時候,就需要記錄之前的舊值,回滾的時候,根據(jù)舊值執(zhí)行update操作
  • (3)當年insert一條數(shù)據(jù)的時候,就需要這條記錄的主鍵,回滾的時候,根據(jù)主鍵執(zhí)行delete操作

undo log記錄了這些回滾需要的信息,當事務(wù)執(zhí)行失敗或調(diào)用了rollback,導(dǎo)致事務(wù)需要回滾,便可以利用undo log中的信息將數(shù)據(jù)回滾到修改之前的樣子。

ps:具體的undo log日志長啥樣,這個可以寫一篇文章了。而且寫出來,看的人也不多,姑且先這么簡單的理解吧。

問題三: Mysql怎么保證持久性的?

OK,是利用Innodb的redo log。

正如之前說的,Mysql是先把磁盤上的數(shù)據(jù)加載到內(nèi)存中,在內(nèi)存中對數(shù)據(jù)進行修改,再刷回磁盤上。如果此時突然宕機,內(nèi)存中的數(shù)據(jù)就會丟失。

怎么解決這個問題?

簡單啊,事務(wù)提交前直接把數(shù)據(jù)寫入磁盤就行啊。

這么做有什么問題?

  • 只修改一個頁面里的一個字節(jié),就要將整個頁面刷入磁盤,太浪費資源了。畢竟一個頁面16kb大小,你只改其中一點點東西,就要將16kb的內(nèi)容刷入磁盤,聽著也不合理。
  • 畢竟一個事務(wù)里的SQL可能牽涉到多個數(shù)據(jù)頁的修改,而這些數(shù)據(jù)頁可能不是相鄰的,也就是屬于隨機IO。顯然操作隨機IO,速度會比較慢。

于是,決定采用redo log解決上面的問題。當做數(shù)據(jù)修改的時候,不僅在內(nèi)存中操作,還會在redo log中記錄這次操作。當事務(wù)提交的時候,會將redo log日志進行刷盤(redo log一部分在內(nèi)存中,一部分在磁盤上)。當數(shù)據(jù)庫宕機重啟的時候,會將redo log中的內(nèi)容恢復(fù)到數(shù)據(jù)庫中,再根據(jù)undo log和binlog內(nèi)容決定回滾數(shù)據(jù)還是提交數(shù)據(jù)。

采用redo log的好處?

其實好處就是將redo log進行刷盤比對數(shù)據(jù)頁刷盤效率高,具體表現(xiàn)如下

  • redo log體積小,畢竟只記錄了哪一頁修改了啥,因此體積小,刷盤快。
  • redo log是一直往末尾進行追加,屬于順序IO。效率顯然比隨機IO來的快。

ps:不想具體去談redo log具體長什么樣,因為內(nèi)容太多了。

問題四: Mysql怎么保證隔離性的?

OK,利用的是鎖和MVCC機制。還是拿轉(zhuǎn)賬例子來說明,有一個賬戶表如下

表名t_balance

id user_id balance
1 A 200
2 B 0

其中id是主鍵,user_id為賬戶名,balance為余額。還是以轉(zhuǎn)賬兩次為例,如下圖所示

至于MVCC,即多版本并發(fā)控制(Multi Version Concurrency Control),一個行記錄數(shù)據(jù)有多個版本對快照數(shù)據(jù),這些快照數(shù)據(jù)在undo log中。

如果一個事務(wù)讀取的行正在做DELELE或者UPDATE操作,讀取操作不會等行上的鎖釋放,而是讀取該行的快照版本。

由于MVCC機制在可重復(fù)讀(Repeateable Read)和讀已提交(Read Commited)的MVCC表現(xiàn)形式不同,就不贅述了。

但是有一點說明一下,在事務(wù)隔離級別為讀已提交(Read Commited)時,一個事務(wù)能夠讀到另一個事務(wù)已經(jīng)提交的數(shù)據(jù),是不滿足隔離性的。但是當事務(wù)隔離級別為可重復(fù)讀(Repeateable Read)中,是滿足隔離性的。

總結(jié)

本文講了Mysql中事務(wù)ACID四大特性的實現(xiàn)原理,希望大家有所收獲。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

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

標簽:駐馬店 陜西 鄂爾多斯 北京 荊門 黔西 梅河口 昌都

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Mysql中事務(wù)ACID的實現(xiàn)原理詳解》,本文關(guān)鍵詞  Mysql,中,事務(wù),ACID,的,實現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Mysql中事務(wù)ACID的實現(xiàn)原理詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Mysql中事務(wù)ACID的實現(xiàn)原理詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美国产欧美综合| 亚洲精品中文在线观看| 亚洲三级免费电影| 日本在线不卡视频一二三区| 国产成人综合精品三级| 欧美视频在线播放| 国产精品免费观看视频| 亚洲第一久久影院| 国产成人福利片| 在线成人小视频| 国产精品乱码一区二区三区软件 | 亚洲视频在线观看一区| 日韩精品一二三| 色999日韩国产欧美一区二区| 久久人人97超碰com| 偷窥少妇高潮呻吟av久久免费| 国产麻豆一精品一av一免费| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 精品99999| 日日噜噜夜夜狠狠视频欧美人| 成人午夜私人影院| 26uuu国产一区二区三区| 天天操天天干天天综合网| av亚洲精华国产精华| 日韩精品一区二区三区三区免费| 一二三四区精品视频| 国产一区二区免费在线| 337p亚洲精品色噜噜噜| 一级日本不卡的影视| 成人一级黄色片| 久久久久久久久久美女| 一区二区日韩电影| 成人短视频下载| 欧美在线观看视频一区二区三区| 欧美一区二区三区性视频| 亚洲精品国产精品乱码不99| 高清beeg欧美| 日本一区二区三区视频视频| 激情综合一区二区三区| 日韩欧美国产高清| 蜜臀av在线播放一区二区三区 | 99国内精品久久| 中文字幕国产一区二区| 国产91丝袜在线播放0| 中文字幕不卡在线播放| 成人小视频在线| 国产喷白浆一区二区三区| 国产乱子伦视频一区二区三区 | 91精品国产91久久综合桃花| 日韩国产欧美三级| 日韩亚洲国产中文字幕欧美| 久久精品国产亚洲a| 久久精品视频在线看| 成人高清视频在线观看| 亚洲综合丝袜美腿| 欧美一区二区视频免费观看| 韩国成人在线视频| 国产精品沙发午睡系列990531| 91老司机福利 在线| 亚洲高清免费在线| 精品国产乱码久久久久久图片| 狠狠色伊人亚洲综合成人| 国产精品成人免费精品自在线观看| 色诱视频网站一区| 久久精品理论片| 国产精品国产三级国产普通话三级| 91免费观看在线| 免费高清视频精品| 国产精品久久久久aaaa| 欧美日本一区二区三区| 国产99久久久国产精品潘金| 亚洲一区免费观看| 久久久国产一区二区三区四区小说 | 99久久亚洲一区二区三区青草| 久久色中文字幕| 国产成人精品免费在线| 亚洲激情自拍偷拍| 精品一区二区国语对白| 亚洲人妖av一区二区| 欧美一区在线视频| 国产一区999| 视频一区二区三区中文字幕| 日韩欧美高清在线| 欧美亚洲另类激情小说| 亚洲国产一区二区在线播放| 久久精品视频免费观看| 99久久久久久| 精品噜噜噜噜久久久久久久久试看 | 日韩精品电影在线| 91精品午夜视频| 91啪亚洲精品| 青青草97国产精品免费观看| 艳妇臀荡乳欲伦亚洲一区| 欧美撒尿777hd撒尿| 成人高清免费观看| 亚洲国产精品久久人人爱蜜臀| 久久精品免视看| 欧美在线免费观看亚洲| 色综合天天性综合| 国产欧美日韩亚州综合 | 精品国产伦一区二区三区观看方式| 国产成人免费在线| 水野朝阳av一区二区三区| 精品少妇一区二区三区在线播放| 99精品国产99久久久久久白柏| 午夜激情一区二区| 国产欧美精品一区二区色综合| 国产精品1区二区.| 亚洲高清免费观看 | 亚洲一级二级在线| 国产精品久久久久久久久免费桃花 | 成人午夜视频在线| 亚洲电影在线播放| 亚洲午夜电影在线| 久久久噜噜噜久噜久久综合| 日韩女优制服丝袜电影| a亚洲天堂av| 色偷偷成人一区二区三区91| 亚洲国产成人精品视频| 一区二区三区四区激情| 热久久免费视频| 亚洲人快播电影网| 久久综合网色—综合色88| 在线观看精品一区| 欧美日韩午夜在线| 91在线观看一区二区| 成人av电影在线| 一区二区三区四区在线| 亚洲一区二区三区四区在线| 欧美一区二区三区视频在线| 一本一道波多野结衣一区二区 | 中文字幕一区二区三区av| 国产精品嫩草影院av蜜臀| 久久婷婷色综合| 欧美国产日韩亚洲一区| 欧美草草影院在线视频| 国产香蕉久久精品综合网| 日韩欧美中文字幕精品| 久久久久亚洲蜜桃| 日韩欧美激情在线| 久久精品人人爽人人爽| 中文字幕av不卡| 久久久激情视频| 亚洲欧洲综合另类| 中文字幕制服丝袜一区二区三区 | 日本久久电影网| 欧美一区午夜视频在线观看 | 久久久久久久久99精品| 国产午夜三级一区二区三| 欧美国产综合一区二区| 国产亚洲成av人在线观看导航 | 在线欧美日韩精品| 欧美一区二区网站| 欧美日韩国产综合一区二区三区| 精品成a人在线观看| 精品久久久久久无| 国产精品久久久久精k8| 自拍偷拍亚洲欧美日韩| 免费观看91视频大全| 亚洲精品乱码久久久久久日本蜜臀| 天堂va蜜桃一区二区三区 | 色综合天天综合网天天狠天天| jizzjizzjizz欧美| 日韩一区二区电影在线| 日韩一区二区精品在线观看| 最新欧美精品一区二区三区| 国产精品久久久久久久久晋中| 男男视频亚洲欧美| 日本视频一区二区三区| 91视频一区二区| 国产亚洲精品aa| 亚洲欧美日韩国产中文在线| 狠狠色丁香婷婷综合| 国产成人精品一区二| 欧美不卡视频一区| 日韩久久精品一区| 国产午夜精品理论片a级大结局| 亚洲一区在线观看免费观看电影高清| 美腿丝袜亚洲一区| 欧美日韩在线免费视频| 日韩丝袜美女视频| 亚洲成av人**亚洲成av**| 成人禁用看黄a在线| 日韩午夜三级在线| 亚洲尤物在线视频观看| 精品一区二区三区欧美| 欧美久久高跟鞋激| 国产性天天综合网| 国产毛片一区二区| 成人h动漫精品一区二| 国产午夜精品美女毛片视频| 美日韩一区二区三区| 99久久精品国产麻豆演员表| 国产亚洲一区字幕| 无码av免费一区二区三区试看| 在线精品视频一区二区| 欧美日韩精品福利| 午夜影院久久久| 欧美视频一区二区| 自拍偷拍欧美精品|