MySQL事務原理

2022-04-26 01:30:39 字數 1924 閱讀 9421

原子性、穩定性和永續性是通過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...