原子性(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 讓資料保持一定程度的合理性,比如使用者加入購物車,購物...