原子性、穩定性和永續性是通過redo 和 undo 日誌檔案實現的,不管是redo還是undo檔案都會有乙個快取我們稱之為redo_buf和undo_buf。同樣,資料庫檔案也會有快取稱之為data_buf。
undo記錄了資料在事務開始之前的值,當事務執行失敗或者rollback時可以通過undo記錄的值來恢復資料。例如 aa和bb的初始值分別為3,5。
a 事務開始
b 記錄aa=3到undo_buf
c 修改aa=1
d 記錄bb=5到undo_buf
e 修改bb=7
f 將undo_buf寫到undo(磁碟)
g 將data_buf寫到datafile(磁碟)
h 事務提交
通過undo可以保證原子性、穩定性和永續性
如果事務在f之前崩潰由於資料還沒寫入磁碟,所以資料不會被破壞。
如果事務在g之前崩潰或者回滾則可以根據undo恢復到初始狀態。
資料在任務提交之前寫到磁碟保證了永續性。
但是單純使用undo保證原子性和永續性需要在事務提交之前將資料寫到磁碟,浪費大量i/o。
引入redo日誌記錄資料修改後的值,可以避免資料在事務提交之前必須寫入到磁碟的需求,減少i/o。
a 事務開始
b 記錄aa=3到undo_buf
c 修改aa=1 記錄redo_buf
d 記錄bb=5到undo_buf
e 修改bb=7 記錄redo_buf
f 將redo_buf寫到redo(磁碟)
g 事務提交
通過undo保證事務的原子性,redo保證永續性。
f之前崩潰由於所有資料都在記憶體,恢復後重新衝磁碟載入之前的資料,資料沒有被破壞。
fg之間的崩潰可以使用redo來恢復。
g之前的回滾都可以使用undo來完成。
如果需要使用事務就必須選用支援事務的資料庫引擎如innodb和falcon,myisam並不支援事務。
在預設情況下mysql開啟的是autocommit模式,也就是隱含的將每條語句當做乙個事務處理,每條sql都會被自動提交。當我們使用begin或者start transcation時會把自動提交掛起,直到顯示的呼叫commit。使用事務可以有如下兩種方法:
begin; //開始事務,掛起自動提交
insert into t_cart_shopcart (user_id, sku_id, amount, shop_id, status) values(10001, 10001, 1, 10001, 0);
insert into t_cart_shopcart (user_id, sku_id, amount, shop_id, status) values(10001, 10002, 1, 10001, 0);
commit; //提交事務,恢復自動提交
set autocommit = 0; //掛起自動提交
insert into t_cart_shopcart (user_id, sku_id, amount, shop_id, status) values(10001, 10001, 1, 10001, 0);
insert into t_cart_shopcart (user_id, sku_id, amount, shop_id, status) values(10001, 10002, 1, 10001, 0);
commit; //提交事務
set autocommit = 1; //恢復自動提交
這兩種方式效果相同 mysql掛起事務 MySQL事務原理
原子性 穩定性和永續性實現原理 原子性 穩定性和永續性是通過redo 和 undo 日誌檔案實現的,不管是redo還是undo檔案都會有乙個快取我們稱之為redo buf和undo buf。同樣,資料庫檔案也會有快取稱之為data buf。4.1 undo 日誌檔案 undo記錄了資料在事務開始之前...
mysql 事務 執行原理 概述
以前沒有深究過資料庫底層是怎麼運作的,只是停留在了概念層次,但是後來發現寫程式的時候不是很舒服,總感覺有些點不通,於是決定看看mysql innodb引擎的原理,這裡只是乙個大致的介紹,不會太深入。如果我們在mysql的客戶端執行了一些個操作,我們不了解任何底層,最簡單的概念模型就是認為資料庫的表裡...
mysql 事務及其MVCC原理
mysql事務分為四類 4種隔離級別 1.未提交讀 read uncommitted ru ru sessiona a讀取b中update中未commit中的資料,讀到的 若此時b進行了rollback回滾操作。a中讀取到的值依然是b 修改後的這個值,這就是所謂的髒讀 sessionb update...