mysql ACID特性

事務(wù)的四大特性:

原子性(Atomicity)
一致性(Consistency)
隔離性(Isolation)
持久性(Durability)

Mysql怎么保證原子性的?

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

(1)當(dāng)你delete一條數(shù)據(jù)的時(shí)候,就需要記錄這條數(shù)據(jù)的信息,回滾的時(shí)候,insert這條舊數(shù)據(jù)
(2)當(dāng)你update一條數(shù)據(jù)的時(shí)候,就需要記錄之前的舊值,回滾的時(shí)候,根據(jù)舊值執(zhí)行update操作
(3)當(dāng)年insert一條數(shù)據(jù)的時(shí)候,就需要這條記錄的主鍵,回滾的時(shí)候,根據(jù)主鍵執(zhí)行delete操作
undo log記錄了這些回滾需要的信息,當(dāng)事務(wù)執(zhí)行失敗或調(diào)用了rollback,導(dǎo)致事務(wù)需要回滾,便可以利用undo log中的信息將數(shù)據(jù)回滾到修改之前的樣子。

Mysql怎么保證持久性的?

利用Innodb的redo log。 正如之前說(shuō)的,Mysql是先把磁盤(pán)上的數(shù)據(jù)加載到內(nèi)存中,在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行修改,再刷回磁盤(pán)上。如果此時(shí)突然宕機(jī),內(nèi)存中的數(shù)據(jù)就會(huì)丟失。 怎么解決這個(gè)問(wèn)題? 簡(jiǎn)單啊,事務(wù)提交前直接把數(shù)據(jù)寫(xiě)入磁盤(pán)就行啊。 這么做有什么問(wèn)題?

只修改一個(gè)頁(yè)面里的一個(gè)字節(jié),就要將整個(gè)頁(yè)面刷入磁盤(pán),太浪費(fèi)資源了。畢竟一個(gè)頁(yè)面16kb大小,你只改其中一點(diǎn)點(diǎn)東西,就要將16kb的內(nèi)容刷入磁盤(pán),聽(tīng)著也不合理。
畢竟一個(gè)事務(wù)里的SQL可能牽涉到多個(gè)數(shù)據(jù)頁(yè)的修改,而這些數(shù)據(jù)頁(yè)可能不是相鄰的,也就是屬于隨機(jī)IO。顯然操作隨機(jī)IO,速度會(huì)比較慢。
于是,決定采用redo log解決上面的問(wèn)題。當(dāng)做數(shù)據(jù)修改的時(shí)候,不僅在內(nèi)存中操作,還會(huì)在redo log中記錄這次操作。當(dāng)事務(wù)提交的時(shí)候,會(huì)將redo log日志進(jìn)行刷盤(pán)(redo log一部分在內(nèi)存中,一部分在磁盤(pán)上)。當(dāng)數(shù)據(jù)庫(kù)宕機(jī)重啟的時(shí)候,會(huì)將redo log中的內(nèi)容恢復(fù)到數(shù)據(jù)庫(kù)中,再根據(jù)undo log和binlog內(nèi)容決定回滾數(shù)據(jù)還是提交數(shù)據(jù)。

采用redo log的好處?

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

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

Mysql怎么保證隔離性的?

利用的是鎖和MVCC機(jī)制。

至于MVCC,即多版本并發(fā)控制(Multi Version Concurrency Control),一個(gè)行記錄數(shù)據(jù)有多個(gè)版本對(duì)快照數(shù)據(jù),這些快照數(shù)據(jù)在undo log中。 如果一個(gè)事務(wù)讀取的行正在做DELELE或者UPDATE操作,讀取操作不會(huì)等行上的鎖釋放,而是讀取該行的快照版本。 由于MVCC機(jī)制在可重復(fù)讀(Repeateable Read)和讀已提交(Read Commited)的MVCC表現(xiàn)形式不同,就不贅述了。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容