1. 程式人生 > >MySQL事務原理

MySQL事務原理

num tor 就是 cati amount ret car rollback 自動提交

原子性、穩定性和持久性實現原理

  原子性、穩定性和持久性是通過redo 和 undo 日誌文件實現的,不管是redo還是undo文件都會有一個緩存我們稱之為redo_buf和undo_buf。同樣,數據庫文件也會有緩存稱之為data_buf。

4.1 undo 日誌文件

  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 事務提交
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  通過undo可以保證原子性、穩定性和持久性
  如果事務在F之前崩潰由於數據還沒寫入磁盤,所以數據不會被破壞。
  如果事務在G之前崩潰或者回滾則可以根據undo恢復到初始狀態。
  數據在任務提交之前寫到磁盤保證了持久性。
  但是單純使用undo保證原子性和持久性需要在事務提交之前將數據寫到磁盤,浪費大量I/O。

4.2 redo/undo 日誌文件

  引入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 事務提交
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  通過undo保證事務的原子性,redo保證持久性。
  F之前崩潰由於所有數據都在內存,恢復後重新沖磁盤載入之前的數據,數據沒有被破壞。
  FG之間的崩潰可以使用redo來恢復。
  G之前的回滾都可以使用undo來完成。

5 事務操作命令

  如果需要使用事務就必須選用支持事務的數據庫引擎如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; //提交事務,恢復自動提交
  • 1
  • 2
  • 3
  • 4
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; //恢復自動提交
  • 1
  • 2
  • 3
  • 4
  • 5

  這兩種方式效果相同

MySQL事務原理