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

講講MySQL Innodb ACID 的實現原理

數據庫 MySQL
本文主要探討MySQL InnoDB 引擎下ACID的實現原理,ACIDMySQL 作為一個關系型數據庫,以最常見的 InnoDB 引擎來說,是如何保證 ACID 的。

[[410031]]

本文主要探討MySQL InnoDB 引擎下ACID的實現原理,對于諸如什么是事務,隔離級別的含義等知識請看我前面mysql 系列的文章。

ACID

MySQL 作為一個關系型數據庫,以最常見的 InnoDB 引擎來說,是如何保證 ACID 的。

  • (Atomicity)原子性:事務是最小的執行單位,不允許分割。原子性確保動作要么全部完成,要么完全不起作用;
  • (Consistency)一致性:執行事務前后,數據保持一致;
  • (Isolation)隔離性:并發訪問數據庫時,一個事務不被其他事務所干擾。
  • (Durability)持久性: 一個事務被提交之后。對數據庫中數據的改變是持久的,即使數據庫發生故障。

隔離性

隔離性主要是 鎖 和 MVCC 實現的。這個也可以看我前面mysql 系列的文章,這里就不在贅述了。

原子性

MySQL的日志有很多種,如二進制日志、錯誤日志、查詢日志、慢查詢日志等,此外InnoDB存儲引擎還提供了兩種事務日志:

redo log(重做日志)和undo log(回滾日志)。其中redo log用于保證事務持久性;

undo log則是事務原子性和隔離性實現的基礎。

undo log ,回滾日志。我們知道隔離性的MVCC就是依靠它來實現的,原子性也是。實現原子性的關鍵,是當事務回滾時能夠撤銷所有已經成功執行的sql語句。

當事務對數據庫進行修改時,InnoDB會生成對應的 undo log;如果事務執行失敗或調用了 rollback,導致事物需要回滾,便可以利用 undo log 中的信息將數據回滾到修改之前的樣子。undo log 屬于邏輯日志,它記錄的是sql執行相關的信息。當發生回滾時,InnoDB 會根據 undo log 的內容做與之前相反的工作:

  • 對于每個 insert,回滾時會執行 delete;
  • 對于每個 delete,回滾時會執行insert;
  • 對于每個 update,回滾時會執行一個相反的 update,把數據改回去。

以update操作為例:當事務執行update時,其生成的undo log中會包含被修改行的主鍵(以便知道修改了哪些行)、修改了哪些列、這些列在修改前后的值等信息,回滾時便可以使用這些信息將數據還原到update之前的狀態。

持久性

上面講到Innnodb有很多 log,持久性靠的是 redo log。

讀數據:會首先從緩沖池中讀取,如果緩沖池中沒有,則從磁盤讀取在放入緩沖池;

寫數據:會首先寫入緩沖池,緩沖池中的數據會定期同步到磁盤中(會產生臟讀);

于是 redo log就派上用場了。

既然redo log也需要存儲,也涉及磁盤IO為啥還用它?

1、redo log 的存儲是順序存儲,而緩存同步是隨機操作。

2、緩存同步是以數據頁為單位的,每次傳輸的數據大小大于redo log。

redo log采用的是WAL(Write-ahead logging,預寫式日志),所有修改先寫入日志,再更新到Buffer Pool,保證了數據不會因MySQL宕機而丟失,從而滿足了持久性要求。

既然redo log也需要在事務提交時將日志寫入磁盤,為什么它比直接將Buffer Pool中修改的數據寫入磁盤(即刷臟)要快呢?主要有以下兩方面的原因:

1、刷臟是隨機IO,因為每次修改的數據位置隨機,但寫redo log是追加操作,屬于順序IO。

2、刷臟是以數據頁(Page)為單位的,MySQL默認頁大小是16KB,一個Page上一個小修改都要整頁寫入;而redo log中只包含真正需要寫入的部分,無效IO大大減少。

redo log 與binlog的區別:

1、作用不同:redo log是用于crash recovery的,保證MySQL宕機也不會影響持久性;binlog是用于point-in-time recovery的,保證服務器可以基于時間點恢復數據,此外binlog還用于主從復制。

2、層次不同:redo log是InnoDB存儲引擎實現的,而binlog是MySQL的服務器層(可以參考文章前面對MySQL邏輯架構的介紹)實現的,同時支持InnoDB和其他存儲引擎。

3、內容不同:redo log是物理日志,內容基于磁盤的Page;binlog的內容是二進制的,根據binlog_format參數的不同,可能基于sql語句、基于數據本身或者二者的混合。

4、寫入時機不同:binlog在事務提交時寫入;redo log的寫入時機相對多元:

默認刷盤策略:當事務提交時會調用fsync對redo log進行刷盤;修改innodb_flush_log_at_trx_commit參數可以改變該策略,但事務的持久性將無法保證。

其他刷盤時機:如master thread每秒刷盤一次redo log等,這樣的好處是不一定要等到commit時刷盤,commit速度大大加快。

我們看看一條SQL更新語句怎么運行的:

比如:

update t set age=20 where id=1;

持久性肯定和寫有關,MySQL 用到了 WAL 技術,WAL 的全稱是 Write-Ahead Logging,它的關鍵點就是先寫日志,再寫磁盤。

[redo log]

redo log 就是這個日志,當有一條記錄要更新時,InnoDB 引擎就會先把記錄寫到 redo log(并更新內存),這個時候更新就算完成了。在適當的時候(上文提到的刷盤時機),將這個操作記錄更新到磁盤里面,redo log 有兩個特點:

大小固定,循環寫

  • crash-safe(只要刷入磁盤的數據,都會從 redo log 中抹掉,數據庫重啟后,直接把 redo log 中的數據都恢復至內存就可以了。這就是為什么 redo log 具有 crash-safe 的能力)

對于redo log 是有兩階段的:commit 和 prepare 如果不使用“兩階段提交”,數據庫的狀態就有可能和用它的日志恢復出來的庫的狀態不一致.

[Buffer Pool]

Buffer Pool 中包含了磁盤中部分數據頁的映射,作為訪問數據庫的緩沖:

  • 當讀取數據時,會先從Buffer Pool中讀取,如果Buffer Pool中沒有,則從磁盤讀取后放入Buffer Pool;
  • 當向數據庫寫入數據時,會首先寫入Buffer Pool,Buffer Pool中修改的數據會定期刷新到磁盤中。

Buffer Pool 的使用大大提高了讀寫數據的效率,但是也帶了新的問題:如果MySQL宕機,而此時 Buffer Pool 中修改的數據還沒有刷新到磁盤,就會導致數據的丟失,事務的持久性無法保證。

所以加入了 redo log。 當數據修改時,除了修改Buffer Pool中的數據,還會在redo log記錄這次操作;

當事務提交時,會調用fsync接口對redo log進行刷盤。

如果MySQL宕機,重啟時可以讀取redo log中的數據,對數據庫進行恢復。

一致性

一致性是事務追求的最終目標,實現一致性的措施包括:

  • 保證原子性、持久性和隔離性,如果這些特性無法保證,事務的一致性也無法保證.
  • 數據庫本身提供保障,例如不允許向整形列插入字符串值、字符串長度不能超過列的限制等
  • 應用層面進行保障,例如如果轉賬操作只扣除轉賬者的余額,而沒有增加接收者的余額,無論數據庫實現的多么完美,也無法保證狀態的一致.

CAP 和ACID中的一致性

CAP 定理中的數據一致性,其實是說分布式系統中的各個節點中對于同一數據的拷貝有著相同的值;而 ACID 中的一致性是指數據庫的規則,如果 schema 中規定了一個值必須是唯一的,那么一致的系統必須確保在所有的操作中,該值都是唯一的,由此來看 CAP 和 ACID 對于一致性的定義有著根本性的區別。

總結

事務的 ACID 四大基本特性是保證數據庫能夠運行的基石,但是完全保證數據庫的 ACID,尤其是隔離性會對性能有比較大影響,在實際的使用中我們也會根據業務的需求對隔離性進行調整,除了隔離性,數據庫的原子性和持久性相信都是比較好理解的特性,前者保證數據庫的事務要么全部執行、要么全部不執行,后者保證了對數據庫的寫入都是持久存儲的、非易失的,而一致性不僅是數據庫對本身數據的完整性的要求,同時也對開發者提出了要求 - 寫出邏輯正確并且合理的事務。

最后,也是最重要的,當別人在講一致性的時候,一定要搞清楚他的上下文。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2019-04-03 09:27:01

MySQLInnoDB務ACID

2024-12-30 13:58:14

2021-09-17 12:50:10

MySQL數據庫ACID

2019-01-29 09:36:10

MySQLACID特性

2024-04-08 10:11:15

MYSQL數據庫事務

2020-11-13 07:11:23

MySQL復制日志

2020-02-13 10:14:11

MySQL事務ACID

2020-12-08 06:17:11

MycatMySQL分離

2021-09-27 07:11:18

MySQLACID特性

2020-12-15 09:57:51

InnoDB架構MySQ

2020-07-28 00:58:20

IP地址子網TCP

2021-07-23 13:34:50

MySQL存儲InnoDB

2024-10-07 10:02:28

2024-10-10 08:27:39

2021-06-30 18:16:38

MySQLWal策略

2023-01-30 18:44:45

MVCC事務

2024-12-02 08:37:04

2010-11-23 12:39:05

MySQL InnoD

2017-11-28 15:24:14

ETA配送構造

2025-12-01 09:11:04

點贊
收藏

51CTO技術棧公眾號

色狼人综合干| gogogo免费视频观看亚洲一| 永久免费精品影视网站| 国产在线色视频| 国产精品情趣视频| 日韩国产欧美亚洲| 国产精品一区三区| 亚洲毛片aa| 日本午夜一区二区| 欧美18视频| 亚洲精品裸体| 99热国产免费| 黑丝一区二区| 狠狠色综合欧美激情| 欧美色综合网| 成人深夜直播免费观看| 欧美日韩一二| 国产日产亚洲精品| 91成人观看| 国产精品一区免费观看| 99热在线精品观看| 欧美aaaaa喷水| 免费在线视频一区| 黄色影视在线观看| k8久久久一区二区三区| 18禁男女爽爽爽午夜网站免费| 不卡视频免费播放| 成人中文字幕av| 亚洲天天做日日做天天谢日日欢| jizzjizz中文| 亚洲国产wwwccc36天堂| 四虎影视2018在线播放alocalhost| 岛国av在线不卡| a天堂中文在线88| 日韩精品一区二区三区视频播放| h片在线观看下载| 日韩中文字幕免费看| 999久久久久久久久6666| 久久久亚洲精选| 成人精品久久| 精品国产乱码一区二区三区四区| 国内露脸中年夫妇交换精品| 亚洲伊人久久综合| 婷婷激情成人| 亚洲老头同性xxxxx| 伊人情人综合网| 91在线短视频| 亚洲精品三级| 亚洲五月六月| 久久美女艺术照精彩视频福利播放| 黄色三级视频片| 一级精品视频在线观看宜春院 | 日本久久电影网| 国产二区三区在线| 亚洲无av在线中文字幕| 美女国内精品自产拍在线播放| 亚洲日本中文| 国产男小鲜肉同志免费| 精品久久久久国产| 黄色网页在线免费看| 伊人久久大香线蕉av一区二区| 丁香婷婷成人| 国产高清一区视频| 国产精品一品视频| 天天影视色香欲综合| 精品日韩99亚洲| 国产一区调教| 亚洲v国产v| 中文久久乱码一区二区| 成人一区二区不卡免费| 精品国内产的精品视频在线观看| 精品国产一区二区三区四区| 亚洲精品一区二区毛豆| 可以看av的网站久久看| 米奇精品一区二区三区| 久久久久久国产精品| 色综合天天色| 欧美经典一区二区| 青青草手机在线| 亚洲色图35p| 日韩片欧美片| 日韩一级片免费视频| 红桃av永久久久| 欧美黄色网络| 久久涩涩网站| 亚洲图片欧美激情| xxxxxx欧美| yellow视频在线观看一区二区| 91丨九色丨黑人外教| 婷婷在线视频| 欧美性一区二区三区| 精东粉嫩av免费一区二区三区| **毛片在线网站| zzjj国产精品一区二区| 亚洲视频综合| 超级污的网站| 中文综合在线观看| 日韩av电影天堂| 男人的天堂在线| 97精品一区二区三区| 国产精品一区二区三区网站| 黄色在线免费观看大全| 7m第一福利500精品视频| 国产资源在线一区| 免费黄网在线观看| 成人精品久久av网站| 日本一区二区综合亚洲| 在线天堂新版最新版在线8| 国产精品播放| 性做久久久久久免费观看| 亚洲精品一二三**| 日韩免费视频播放| 亚洲视频999| 久久精品国产**网站演员| 中文字幕日本在线| 99蜜桃在线观看免费视频网站| 一区二区三区在线播| 97视频一区| 日韩欧美不卡在线| 国产香蕉一区二区三区在线视频 | 日本亚洲天堂| 午夜精品久久久久久99热软件| 粉嫩一区二区三区在线看| 成人国产电影在线观看| 日韩免费av一区二区三区| 欧美男同性恋视频网站| 欧美日韩国内| 电影在线一区| 精品不卡一区二区三区| 欧美喷潮久久久xxxxx| 欧美日一区二区三区在线观看国产免| 中文在线www| 91久久精品美女高潮| 亚洲精品va| 国产精品久久久久久久久久白浆 | 欧美福利视频在线| 亚洲一区av在线| 中文字幕一区二区三区日韩精品| 黄网站色视频免费观看| 激情五月综合| av中文一区| 老司机在线精品视频| 亚洲天堂第一区| 国产视频精品免费播放| 极品尤物av久久免费看| 在线中文字幕播放| 久久在线中文字幕| 欧美精品制服第一页| 国产精品色呦呦| 亚洲尤物av| 黄色片在线播放| 久久天堂国产精品| 国产视频精品久久久| 91在线视频在线| 神马午夜久久| 在线视频中文字幕| 九九九九精品| 亚洲天堂久久av| 久久久精品2019中文字幕之3| 9l视频自拍蝌蚪9l视频成人| 最新av电影| 欧美一区二区三区成人久久片| 亚洲日韩欧美视频| 日韩美女视频19| 亚洲日本免费| 四虎成人精品一区二区免费网站| 黄页在线观看| 久久精品ww人人做人人爽| 在线观看日韩www视频免费| 国产精品久久久久久久午夜片 | 中文在线有码| 亚欧洲精品在线视频免费观看| xxxx欧美18另类的高清| 亚洲香蕉伊在人在线观| 日韩精品色哟哟| 日韩欧美一级| 不卡在线视频| 亚洲色成人www永久在线观看| 国产精品黄色av| 亚洲激情免费观看| 亚洲精品国产一区二区精华液 | 亚洲国产日韩一区二区| 国产欧美一区二区色老头 | 久久国内精品一国内精品| 亚洲综合免费观看高清在线观看| 免费在线欧美黄色| 成人精品在线| 成人在线观看一区| 成年人观看网站| 国产三区二区一区久久| 精品国产欧美成人夜夜嗨| 一本色道综合亚洲| 成人高清视频在线观看| 欧美日韩国产免费观看| 国产精品一区二区三区四区在线观看 | 亚洲男子天堂网| 一区二区三区日本| 精品一区二区精品| 亚洲电影影音先锋| www.丝袜精品|