Mysql的原子性 永續性原理

2021-10-10 17:25:50 字數 1359 閱讀 9676

一、mysql怎麼保證一致性的?

一致性的話應該分兩個層面來保證。

1.從資料庫層面,資料庫通過原子性、隔離性、永續性來保證一致性。也就是說acid四大特性之中,c(一致性)是目的,a(原子性)、i(隔離性)、d(永續性)是手段,是為了保證一致性,資料庫提供的手段。資料庫必須要實現aid三大特性,才有可能實現一致性。例如,原子性無法保證,顯然一致性也無法保證。

2.從應用層面,通過**判斷資料庫資料是否有效,然後決定回滾還是提交資料!

二、mysql怎麼保證原子性的?

是利用innodb的undo log。/ondo/

undo log名為回滾日誌,是實現原子性的關鍵,當事務回滾時能夠撤銷所有已經成功執行的sql語句,他需要記錄你要回滾的相應日誌資訊。

例如:(1)當你delete一條資料的時候,就需要記錄這條資料的資訊,回滾的時候,insert這條舊資料

(2)當你update一條資料的時候,就需要記錄之前的舊值,回滾的時候,根據舊值執行update操作

(3)當年insert一條資料的時候,就需要這條記錄的主鍵,回滾的時候,根據主鍵執行delete操

undo log記錄了這些回滾需要的資訊,當事務執行失敗或呼叫了rollback,導致事務需要回滾,便可以利用undo log中的資訊將資料回滾到修改之前的樣子。

三、mysql怎麼保證永續性的?

是利用innodb的redo log。/rido/

正如之前說的,mysql是先把磁碟上的資料載入到記憶體中,在記憶體中對資料進行修改,再刷回磁碟上。如果此時突然宕機,記憶體中的資料就會丟失。

怎麼解決這個問題?

簡單啊,事務提交前直接把資料寫入磁碟就行啊。

這麼做有什麼問題?

只修改乙個頁面裡的乙個位元組,就要將整個頁面刷入磁碟,太浪費資源了。畢竟乙個頁面16kb大小,你只改其中一點點東西,就要將16kb的內容刷入磁碟,聽著也不合理。

畢竟乙個事務裡的sql可能牽涉到多個資料頁的修改,而這些資料頁可能不是相鄰的,也就是屬於隨機io。顯然操作隨機io,速度會比較慢。

於是,決定採用redo log解決上面的問題。當做資料修改的時候,不僅在記憶體中操作,還會在redo log中記錄這次操作。當事務提交的時候,會將redo log日誌進行刷盤(redo log一部分在記憶體中,一部分在磁碟上)。當資料庫宕機重啟的時候,會將redo log中的內容恢復到資料庫中,再根據undo log和binlog內容決定回滾資料還是提交資料。

mysql預設每頁儲存16kb

undo log、redo log是物理儲存,在做變更操作時mysql會copy原頁資料作為乙個快照,記錄mysql的頁資料。

binlog 是記錄變更操作的sql日誌

原子性 一致性 隔離性 永續性

事務是指對系統進行的一組操作,為了保證系統的完整性,事務需要具有acid特性,具體如下 1.原子性 atomic 乙個事務包含多個操作,這些操作要麼全部執行,要麼全都不執行。實現事務的原子性,要支援回滾操作,在某個操作失敗後,回滾到事務執行之前的狀態。回滾實際上是乙個比較高層抽象的概念,大多數db在...

原子性一致性隔離性永續性

事務是指對系統進行的一組操作,為了保證系統的完整性,事務需要具有acid特性,具體如下 1.原子性 atomic 乙個事務包含多個操作,這些操作要麼全部執行,要麼全都不執行。實現事務的原子性,要支援回滾操作,在某個操作失敗後,回滾到事務執行之前的狀態。回滾實際上是乙個比較高層抽象的概念,大多數db在...

事務的原子性,一致性,隔離性,永續性

事務的原子性 事務的原子性指的是,事務中包含的程式作為資料庫的邏輯工作單位,它所做的對資料改操作要全部執行,要麼全部不執行。這種特性稱為原子性。事務的原子性要求,如果把乙個事務看作是乙個程式,它要麼完整的被執行,要麼完全執行。就是說事務的操縱序列或者完全應用到資料庫或者完全不影響資料庫。這種特性稱為...