mysql acid_Mysql中ACID的原理
原子性 (Atomicity)
原子性是指一個事務是一個不可分割的工作單位,其中的操作要么都做,要么都不做。
隔離性? ?(Isolation)
隔離性是指多個事務并發(fā)執(zhí)行的時候,事務內(nèi)部的操作與其他事務是隔離的,并發(fā)執(zhí)行的各個事務之間不能互相干擾。
持久性? ?(Durability)
持久性是指事務一旦提交,它對數(shù)據(jù)庫的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
一致性? (Consistency)
一致性是指事務執(zhí)行前后,數(shù)據(jù)處于一種合法的狀態(tài),這種狀態(tài)是語義上的而不是語法上的。 這個狀態(tài)是滿足預定的約束就叫做合法的狀態(tài),再通俗一點,這狀態(tài)是由你自己來定義的。滿足這個狀態(tài),數(shù)據(jù)就是一致的,不滿足這個狀態(tài),數(shù)據(jù)就是不一致的!
--------------------------------------------------------------------------------------------------
Mysql怎么保證一致性的?
從數(shù)據(jù)庫層面,數(shù)據(jù)庫通過原子性、隔離性、持久性來保證一致性。也就是說ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔離性)、D(持久性)是手段,是為了保證一致性,數(shù)據(jù)庫提供的手段。數(shù)據(jù)庫必須要實現(xiàn)AID三大特性,才有可能實現(xiàn)一致性。
從應用層面,通過代碼判斷數(shù)據(jù)庫數(shù)據(jù)是否有效,然后決定回滾還是提交數(shù)據(jù)。
--------------------------------------------------------------------------------------------------
Mysql怎么保證原子性的?
利用Innodb的undo log。
undo log名為回滾日志,是實現(xiàn)原子性的關鍵,當事務回滾時能夠撤銷所有已經(jīng)成功執(zhí)行的sql語句,他需要記錄你要回滾的相應日志信息。
例如
(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記錄了這些回滾需要的信息,當事務執(zhí)行失敗或調(diào)用了rollback,導致事務需要回滾,便可以利用undo log中的信息將數(shù)據(jù)回滾到修改之前的樣子。
--------------------------------------------------------------------------------------------------
Mysql怎么保證持久性的?
利用Innodb的redo log(重做日志)。
正如之前說的,Mysql是先把磁盤上的數(shù)據(jù)加載到內(nèi)存中,在內(nèi)存中對數(shù)據(jù)進行修改,再刷回磁盤上。如果此時突然宕機,內(nèi)存中的數(shù)據(jù)就會丟失。
怎么解決這個問題?
簡單啊,事務提交前直接把數(shù)據(jù)寫入磁盤就行啊。
這么做有什么問題?
只修改一個頁面里的一個字節(jié),就要將整個頁面刷入磁盤,太浪費資源了。畢竟一個頁面16kb大小,你只改其中一點點東西,就要將16kb的內(nèi)容刷入磁盤,聽著也不合理。
畢竟一個事務里的SQL可能牽涉到多個數(shù)據(jù)頁的修改,而這些數(shù)據(jù)頁可能不是相鄰的,也就是屬于隨機IO。顯然操作隨機IO,速度會比較慢。
采用redo log解決上面的問題。當做數(shù)據(jù)修改的時候,不僅在內(nèi)存中操作,還會在redo log中記錄這次操作。當事務提交的時候,會將redo log日志進行刷盤(redo log一部分在內(nèi)存中,一部分在磁盤上)。當數(shù)據(jù)庫宕機重啟的時候,會將redo log中的內(nèi)容恢復到數(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來的快。
--------------------------------------------------------------------------------------------------
Mysql怎么保證隔離性的?
利用的是鎖和MVCC機制。
MVCC,即多版本并發(fā)控制(Multi Version Concurrency Control),一個行記錄數(shù)據(jù)有多個版本對快照數(shù)據(jù),這些快照數(shù)據(jù)在undo log中。 如果一個事務讀取的行正在做DELELE或者UPDATE操作,讀取操作不會等行上的鎖釋放,而是讀取該行的快照版本。
--------------------------------------------------------------------------------------------------
在事務隔離級別為讀已提交(Read Commited)時,一個事務能夠讀到另一個事務已經(jīng)提交的數(shù)據(jù),是不滿足隔離性的。但是當事務隔離級別為可重復讀(Repeateable Read)中,是滿足隔離性的。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的mysql acid_Mysql中ACID的原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 颐和园赏荷花最佳时间
- 下一篇: fedora mysql gui_fed