原子性是指乙個事務是乙個不可分割的工作單位,其中的操作要麼都做,要麼都不做。
隔離性是指多個事務併發執行的時候,事務內部的操作與其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
永續性是指事務一旦提交,它對資料庫的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
一致性是指事務執行前後,資料處於一種合法的狀態,這種狀態是語義上的而不是語法上的。 這個狀態是滿足預定的約束就叫做合法的狀態,再通俗一點,這狀態是由你自己來定義的。滿足這個狀態,資料就是一致的,不滿足這個狀態,資料就是不一致的!
mysql怎麼保證一致性的?
從資料庫層面,資料庫通過原子性、隔離性、永續性來保證一致性。也就是說acid四大特性之中,c(一致性)是目的,a(原子性)、i(隔離性)、d(永續性)是手段,是為了保證一致性,資料庫提供的手段。資料庫必須要實現aid三大特性,才有可能實現一致性。
從應用層面,通過**判斷資料庫資料是否有效,然後決定回滾還是提交資料。
mysql怎麼保證原子性的?
利用innodb的undo log
。
undo log
名為回滾日誌,是實現原子性的關鍵,當事務回滾時能夠撤銷所有已經成功執行的sql語句,他需要記錄你要回滾的相應日誌資訊。
例如undo log
記錄了這些回滾需要的資訊,當事務執行失敗或呼叫了rollback,導致事務需要回滾,便可以利用undo log中的資訊將資料回滾到修改之前的樣子。
mysql怎麼保證永續性的?
利用innodb的redo log(
重做日誌)。
正如之前說的,mysql是先把磁碟上的資料載入到記憶體中,在記憶體中對資料進行修改,再刷回磁碟上。如果此時突然宕機,記憶體中的資料就會丟失。
怎麼解決這個問題?
簡單啊,事務提交前直接把資料寫入磁碟就行啊。
這麼做有什麼問題?
採用redo log
解決上面的問題。當做資料修改的時候,不僅在記憶體中操作,還會在redo log
中記錄這次操作。當事務提交的時候,會將redo log
日誌進行刷盤(redo log
一部分在記憶體中,一部分在磁碟上)。當資料庫宕機重啟的時候,會將redo log
中的內容恢復到資料庫中,再根據undo log
和binlog
內容決定回滾資料還是提交資料。
採用redo log的好處?
redo log
進行刷盤比對資料頁刷盤效率高,具體表現如下
mysql怎麼保證隔離性的?
利用的是鎖和mvcc機制。
mvcc,即多版本併發控制(multi version concurrency control),乙個行記錄資料有多個版本對快照資料,這些快照資料在undo log
中。 如果乙個事務讀取的行正在做delele或者update操作,讀取操作不會等行上的鎖釋放,而是讀取該行的快照版本。
在事務隔離級別為讀已提交(read commited)時,乙個事務能夠讀到另乙個事務已經提交的資料,是不滿足隔離性的。但是當事務隔離級別為可重複讀(repeateable read)中,是滿足隔離性的。
Mysql中事務ACID實現原理
照例,我們先來乙個場景 面試官 知道事務的四大特性麼?你 懂,acid嘛,原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 面試官 你們是用mysql資料庫吧,能簡單說說innodb中怎麼實現這四大特性的麼?你 我只知道隔離性是怎麼...
Mysql中事務ACID實現原理
照例,我們先來乙個場景 面試官 知道事務的四大特性麼?你 懂,acid嘛,原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 面試官 你們是用mysql資料庫吧,能簡單說說innodb中怎麼實現這四大特性的麼?你 我只知道隔離性是怎麼...
Mysql中事務ACID的實現原理詳解
照例,我們先來乙個場景 面試官 知道事務的四大特性麼?你 懂,acid嘛,原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 面試官 你們是用mysql資料庫吧,能簡單說說innodb中怎麼實現這四大特性的麼?你 我只知道隔離性是怎麼...