mysql事務分類 實現

2021-09-05 12:52:52 字數 1237 閱讀 5737

原子性(atomicity)

乙個事務中的操作要麼全成功,要麼全失敗

一致性(consistency)

事務開始之前和結束之後,資料庫的完整性約束不被破壞

隔離性(isolation)

每個讀寫事務的物件對其他事務的操作物件相互分離,每個事務之間完全隔離

永續性(durability)

事務一旦提交,結果永久儲存,即使發生宕機等故障,資料庫也能將資料恢復。

1.redo log

當事務開啟,事務中所有的操作都會被寫入儲存引擎的日誌緩衝中,在事務提交之前,會將緩衝中的日誌,全部重新整理到磁碟上進行持久化。

記錄1:記錄2:記錄3:記錄4:記錄5:
2.undo log

通過undo log進行事務回滾。在事務的執行過程中,不僅會記錄redo log,也會記錄undo log用來進行事務的回滾。事務回滾並不會將

資料庫物理地恢復到執行事務之前的樣子,而是將資料庫邏輯地恢復到原來的樣子。意思是,比如乙個事務中,向一張空表中插入10條

資料,並不代表你回滾該事務後,表又變成了空表,可能表中會存在別的資料,這是由於併發事務,別的事務向表中插入了另外的記錄。

所以,在回滾時,實際是做的與之前相反的工作,對於乙個insert操作,回滾時會執行乙個delete操作

以下是undo+redo事務的簡化過程:

假設有2個數值,分別為a和b,值為1,2

1. start transaction;

2. 記錄 a=1 到undo log;

3. update a = 3;

4. 記錄 a=3 到redo log;

5. 記錄 b=2 到undo log;

6. update b = 4;

7. 記錄b = 4 到redo log;

8. 將redo log重新整理到磁碟

9. commit

如果在事務1-8任意一步操作時,如果系統宕機,該事務不會對磁碟上的資料有任何影響。

如果在8-9步之間系統宕機,恢復之後可以選擇回滾事務,也可以繼續提交事務。

在第9步之後系統宕機,如果變更的資料已經刷到磁碟中,則不會有任何影響,如果還沒來得及刷到磁碟,

則系統恢復之後,可以通過redo log的日誌將資料刷到磁碟。

所以redo log是保障事務的永續性和一致性,undo log保障事務的原子性

參考:《mysql技術內幕》

MySQL 事務api實現

mysql中的事務 include include include include mysql.h define set tran set autocommit 0 手動commit 手動commit define unset tran set autocommit 1 自動commit defin...

MySQL事務實現原理

以上是sql 92標準中定義的四種隔離級別。在mysql中,預設的隔離級別是repeatable read 可重複讀 並且解決了幻讀問題。不可重複讀重點在於update和delete,而幻讀的重點在於insert insert update delete 快照讀和當前讀 鎖定讀一致性非鎖定讀假如乙個...

mysql 事務 數量 Mysql 事務

什麼是事務 不可分割的操作,比如乙個事務要修改 a 表和刪除 b 表的資料兩個操作,這兩個操作都成功,這個事務才 commit,不然 rollback 每條 sql 語句都是乙個事務 只對 dml 生效 caid 一致性 consistency 讓資料保持一定程度的合理性,比如使用者加入購物車,購物...