mysql資料庫事務原理(一)

2021-09-30 17:24:13 字數 1892 閱讀 9895

原子性、穩定性和永續性是通過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資料庫事務

維基百科 事務是資料庫管理系統 dbms 執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。只有innodb和ndb 1 原子性 atomicity 事務中的全部操作在資料庫中是不可分割的,要麼全部完成,要麼全部不執行。2 一致性 consistency 幾個並行執行的事務,其執行結果必須與...

MySQL資料庫事務

文章出處 只有innodb引擎支援事務,下邊的內容均以innodb引擎為預設條件 1 髒讀 2 不可重複讀 3 幻讀 1 讀未提交 read uncommitted 可能產生髒讀 不可重複讀 幻讀 2 讀已提交 read committed 避免了髒讀,可能產生不可重複讀 幻讀 3 可重複讀 rep...