MySQL事務原理


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

  原子性、穩定性和持久性是通過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 事務提交

 

  通過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 事務提交

  通過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; //提交事務,恢復自動提交

 

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; //恢復自動提交

 

  這兩種方式效果相同


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM