全面做好政府網(wǎng)站建設(shè)管理工作的通知免費營銷培訓
🚀 分布式事務(wù) 🚀 |
🌲 AI工具、AI繪圖、AI專欄 🍀
🌲 如果你想學到最前沿、最火爆的技術(shù),趕快加入吧?
🌲 作者簡介:碩風和煒,CSDN-Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者🏆,保研|國家獎學金|JAVA開發(fā)技術(shù)棧|面試刷題|面經(jīng)八股文|經(jīng)驗分享|好用的網(wǎng)站工具分享💎💎💎
🌲 恭喜你發(fā)現(xiàn)一枚寶藏博主,趕快收入囊中吧🌻
🌲 人生如棋,我愿為卒,行動雖慢,可誰曾見我后退一步?🎯🎯
🚀 分布式事務(wù) 🚀 |
🍔 目錄
- 🌱 一.分布式事務(wù)之本地事務(wù)
- 🌱 1.1 本地事務(wù) - ACID原則
- 🌱 1.2 本地事務(wù) - 事務(wù)日志undo和redo
- 🌴 1.2.1 事務(wù)日志 - undo log日志
- 🌴 1.2.2 事務(wù)日志 - redo log日志
- 🌴 1.2.3 總結(jié)
- 🌱 二.總結(jié)
- 💬 三.共勉
🌱 一.分布式事務(wù)之本地事務(wù)
🌱 1.1 本地事務(wù) - ACID原則
??本地事務(wù),是指傳統(tǒng)的單機數(shù)據(jù)庫事務(wù),必須具備ACID原則:
-
原子性(A)
所謂的原子性就是說,在整個事務(wù)中的所有操作,要么全部完成,要么全部不做,沒有中間狀態(tài)。對于事務(wù)在執(zhí)行中發(fā)生錯誤,所有的操作都會被回滾,整個事務(wù)就像從沒被執(zhí)行過一樣。
-
一致性(C)
事務(wù)的執(zhí)行必須保證系統(tǒng)的一致性,在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞,就拿轉(zhuǎn)賬為例,A有1000元,B有1000元,如果在一個事務(wù)里A成功轉(zhuǎn)給B500元,那么不管發(fā)生什么,那么最后A賬戶和B賬戶的數(shù)據(jù)之和必須是2000元。
-
隔離性(I)
所謂的隔離性就是說,事務(wù)與事務(wù)之間不會互相影響,一個事務(wù)的中間狀態(tài)不會被其他事務(wù)感知。數(shù)據(jù)庫保證隔離性包括四種不同的隔離級別:
- Read Uncommitted(讀取未提交內(nèi)容)
- Read Committed(讀取提交內(nèi)容)
- Repeatable Read(可重讀)
- Serializable(可串行化)
-
持久性(D)
所謂的持久性,就是說一旦事務(wù)提交了,那么事務(wù)對數(shù)據(jù)所做的變更就完全保存在了數(shù)據(jù)庫中,即使發(fā)生停電,系統(tǒng)宕機也是如此。
總結(jié):在傳統(tǒng)項目中,項目部署基本是單點式:即單個服務(wù)器和單個數(shù)據(jù)庫。這種情況下,數(shù)據(jù)庫本身的事務(wù)機制就能保證ACID的原則,這樣的事務(wù)就是本地事務(wù)。
🌱 1.2 本地事務(wù) - 事務(wù)日志undo和redo
??單個服務(wù)與單個數(shù)據(jù)庫的架構(gòu)中,產(chǎn)生的事務(wù)都是本地事務(wù)。其中原子性和持久性其實是依靠undo和redo 日志來實現(xiàn)。
InnoDB的事務(wù)日志主要分為:
-
undo log(回滾日志,提供回滾操作)
-
redo log(重做日志,提供前滾操作)
🌴 1.2.1 事務(wù)日志 - undo log日志
??undo log的原理很簡單,為了滿足事務(wù)的原子性,在操作任何數(shù)據(jù)之前,首先將數(shù)據(jù)備份到undo Log日志中,undo Log 記錄了此次事務(wù)開始前的數(shù)據(jù)狀態(tài);。然后進行數(shù)據(jù)的修改。如果出現(xiàn)了錯誤或者用戶執(zhí)行了ROLLBACK語句,系統(tǒng)可以利用Undo Log中的備份將數(shù)據(jù)恢復到事務(wù)開始之前的狀態(tài)。
undo log 作用
- 實現(xiàn)事務(wù)原子性,可以用于回滾
- 實現(xiàn)多版本并發(fā)控制(MVCC)
undo log 原理
undo log 產(chǎn)生和銷毀
- undo log在事務(wù)開始前產(chǎn)生
- 當事務(wù)提交之后,undo log 并不能立馬被刪除,而是放入待清理的鏈表
- 會通過后臺線程 purge thread 進行回收處理
總結(jié):undo Log屬于邏輯日志,記錄一個變化過程。例如執(zhí)行一個update,undo log會記錄一個相反的update;執(zhí)行一個delete,undo log會記錄一個insert;
🌴 1.2.2 事務(wù)日志 - redo log日志
??Redo Log記錄的是新數(shù)據(jù)的備份。在事務(wù)提交前,只要將Redo Log持久化即可,不需要將數(shù)據(jù)持久化,減少了IO的次數(shù)。
Redo Log: 記錄了此次事務(wù)**「完成后」** 的數(shù)據(jù)狀態(tài);
Redo log的作用
MySQL實例掛了或宕機了,重啟時,InnoDB存儲引擎會使用redo log恢復數(shù)據(jù),保證數(shù)據(jù)的持久性與完整性。
Redo Log 的工作原理
🌴 1.2.3 總結(jié)
-
undo log 記錄更新前數(shù)據(jù),用于保證事務(wù)原子性
-
redo log 記錄更新后數(shù)據(jù),用于保證事務(wù)的持久性
-
redo log 寫入到buffer緩沖區(qū),事務(wù)提交時寫入磁盤
-
redo log 持久化到了硬盤之后,事務(wù)可提交
-
redo log會在事務(wù)提交之前,或者redo log buffer滿了的時候?qū)懭氪疟P
-
數(shù)據(jù)寫入到內(nèi)存的redo log日志文件中,不過為了避免出現(xiàn)內(nèi)存中與磁盤數(shù)據(jù)不一致的情況,事務(wù)提交后也會將內(nèi)存數(shù)據(jù)刷入磁盤
🌱 二.總結(jié)
??本篇文章主要講解了本地事務(wù)的ACID特性,以及undo log日志和redo log日志的基本概念以及原理,后續(xù)為大家講解分布式事務(wù)更多的內(nèi)容,大家敬請期待呦!!
💬 三.共勉
最后,我想和大家分享一句一直激勵我的座右銘,希望可以與大家共勉! |