undolog可以實(shí)現(xiàn)事務(wù)的原子性,還可以用來實(shí)現(xiàn)MVCC。其原理是,(開啟事務(wù)后)在操作任何數(shù)據(jù)前,先將原數(shù)據(jù)備份到undolog,然后對數(shù)據(jù)進(jìn)行修改,如果此過程中出現(xiàn)異常,或執(zhí)行了rollback語句,可利用undolog中備份的數(shù)據(jù)恢復(fù)到事務(wù)開始之前的狀態(tài)。
成都創(chuàng)新互聯(lián)公司從2013年開始,先為靜寧等服務(wù)建站,靜寧等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為靜寧企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
假設(shè)有A、B兩個(gè)數(shù)據(jù),值分別為1,2。 進(jìn)行+2的事務(wù)操作。
A.事務(wù)開始.
B.記錄A=1到undo log.
C.修改A=3.
D.記錄B=2到undo log.
E.修改B=4.
F.將undo log寫到磁盤。
G.將數(shù)據(jù)寫到磁盤。
H.事務(wù)提交
對于數(shù)據(jù)的操作,都是先讀到內(nèi)存中,然后在內(nèi)存中修改,最后將數(shù)據(jù)寫到磁盤。
之所以能保證原子性,是因?yàn)椋?/p>
A. 更新數(shù)據(jù)前記錄Undo log。
B. 為了保證持久性,必須將數(shù)據(jù)在事務(wù)提交前寫到磁盤。只要事務(wù)成功提交,數(shù)據(jù)必然已經(jīng)持久化。
C. Undo log必須先于數(shù)據(jù)持久化到磁盤。如果在G,H之間系統(tǒng)崩潰,undo log是完整的,可以用來回滾事務(wù)。
D. 如果在A-F之間系統(tǒng)崩潰,因?yàn)閿?shù)據(jù)沒有持久化到磁盤。所以磁盤上的數(shù)據(jù)還是保持在事務(wù)開始前的狀態(tài)。
缺點(diǎn):每個(gè)事務(wù)提交前將數(shù)據(jù)和Undo Log寫入磁盤,這樣會導(dǎo)致大量的磁盤IO,因此性能很低。
所以,為了提升性能,可以在寫數(shù)據(jù)到磁盤前,先寫redolog,這就是wal預(yù)寫日志機(jī)制,這樣先寫redolog日志,數(shù)據(jù)只需先寫到內(nèi)存,因?yàn)閞edolog是順序?qū)?,而?shù)據(jù)落盤則是隨機(jī)寫,要慢得多。 這樣,當(dāng)系統(tǒng)崩潰時(shí),雖然數(shù)據(jù)沒有持久化,但有redolog撐著,數(shù)據(jù)也不會丟。(innodb_flush_log_at_trx_commit? 這個(gè)參數(shù)設(shè)置為2時(shí),那么redolog每次不需落盤,而是寫到os cache中(一定時(shí)間后再flush到磁盤),這樣性能又大大提升,只要操作系統(tǒng)不宕,即便mysql宕了,數(shù)據(jù)也不會丟)
Undo + Redo事務(wù)的簡化過程
A.事務(wù)開始.
B.記錄A=1到undo log.
C.修改A=3.
D.記錄A=3到redo log.
E.記錄B=2到undo log.
F.修改B=4.
G.記錄B=4到redo log.
H.將redo log寫入磁盤。
I.事務(wù)提交
通過undo保證事務(wù)的原子性,redo保證持久性。
但是!??!基于以上的過程,mysql一個(gè)事務(wù)操作依舊十分繁瑣,這也就是其在并發(fā)場景下需借助于nosql來提升性能
redolog和undolog屬于innodb,而在mysql的server層還有一個(gè)binlog,其作用是誤操作后需要靠它來恢復(fù)數(shù)據(jù)以及主從復(fù)制, mysql在update一行數(shù)據(jù)的時(shí)候:
1.執(zhí)行器先找引擎取id=n這一行,id是主鍵,引擎直接用樹搜索到這一行
2.執(zhí)行器拿到引擎給的行數(shù)據(jù),把這個(gè)值加1,得到新的一行數(shù)據(jù),再調(diào)用引擎接口寫入這行新數(shù)據(jù)
3.引擎將這行數(shù)據(jù)更新到內(nèi)存中,同時(shí)將這個(gè)更新操作記錄到redolog中,此時(shí)redolog處于prepare狀態(tài),然后告知執(zhí)行器執(zhí)行完成,隨時(shí)可以提交事務(wù)
4.執(zhí)行器生成這個(gè)操作的binlig,并寫入磁盤
5.執(zhí)行器調(diào)用引擎的提交事務(wù)接口,引擎吧剛剛寫入的redolog改成提交(commit)狀態(tài),更新完成
將redolog的寫入拆成兩個(gè)步驟,prepare和commit,這就是兩階段提交,其目的是為了讓兩份日志(redolog和binlog)之間的邏輯一致
這兩個(gè)日志有三點(diǎn)不同:
1.redolog是innodb特有,binlog是mysql server層實(shí)現(xiàn)的,所有引擎都可以使用,
2.redolog是物理日志,記錄的是在某個(gè)數(shù)據(jù)頁上做了什么修改,binlog是邏輯日志,記錄的是這個(gè)語句的原始邏輯,
3.redolog是循環(huán)寫的,空間固定會用完,binlog是可以追加寫入的,追加寫是指binlog文件寫到一定大小后會切換到下一個(gè),并不會覆蓋以前的日志。
redolog和binlog互相是不可替代的,redolog的作用是提升數(shù)據(jù)寫入時(shí)的性能,并保證事務(wù)的持久化特性,以及崩潰恢復(fù)的能力,而binlog 是無法支持崩潰恢復(fù),因?yàn)樗鼪]有能力恢復(fù)“數(shù)據(jù)頁”。? 而binlog也有著redolog無法替代的功能,一個(gè)是歸檔。redo log 是循環(huán)寫,寫到末尾是要回到開頭繼續(xù)寫的。這樣歷史日志沒法保留,redolog 也就起不到歸檔的作用。還有很多公司有異構(gòu)系統(tǒng)中使用到的組件(比如es,redis等),這些系統(tǒng)就靠消費(fèi) MySQL 的 binlog 來更新自己的數(shù)據(jù)。關(guān)掉 binlog 的話,這些下游系統(tǒng)就沒法輸入了??傊捎诂F(xiàn)在包括 MySQL 高可用在內(nèi)的很多系統(tǒng)機(jī)制都依賴于 binlog,所以“鳩占鵲巢”redo log 還做不到。
原子性, 一個(gè)事務(wù) 要么完全提交 要么完全回滾,不會介于2者之間。 一致性,一個(gè)查詢發(fā)起后,不管數(shù)據(jù)發(fā)生了多少變化 多少事務(wù),查詢結(jié)果應(yīng)當(dāng)為發(fā)起查詢時(shí)間一致的數(shù)據(jù)
什么是數(shù)據(jù)庫事務(wù),MySQL 為什么會使用 InnoDB 作為默認(rèn)選項(xiàng)?
1.原子性(一個(gè)原子事務(wù)中的所有操作要么全部成功,要么全部失敗) 實(shí)現(xiàn)主要基于undo log(回滾日志)
2.一致性(數(shù)據(jù)庫總是從一個(gè)一致性的狀態(tài)轉(zhuǎn)換到另一個(gè)一致性的狀態(tài))
3. 隔離性(針對并發(fā)事務(wù)而言,事務(wù)必須在不干擾其他進(jìn)程或事務(wù)的前提下獨(dú)立執(zhí)行)
4.持久性(一旦事務(wù)提交成功,它對于數(shù)據(jù)的修改就會永久保存到數(shù)據(jù)庫中)
也就是我們常說的事務(wù)ACID,這樣才能保證事務(wù)中數(shù)據(jù)的正確性。
InnoDB支持事務(wù)安全,InnoDB支持表、行(默認(rèn))級鎖,而MyISAM支持表級鎖;
1、原子性:在整個(gè)操作的事務(wù)中,要么全部成功,要么全部失敗。
2、隔離性:所謂隔離性,就是每個(gè)事務(wù)執(zhí)行的時(shí)候,相互之間不會受到影響,都是單獨(dú)的事務(wù)。
3、一致性:也就是說事務(wù)在執(zhí)行之后,必須和之前的數(shù)據(jù)保持一致。
4、持久性:事務(wù)一旦提交,就會持久化到數(shù)據(jù)庫中,不能回滾。
1、原子性(Atomicity)原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。
2、 一致性(Consistency)一致性是指事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),也就是說一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性。
3、隔離性(Isolation)隔離性是當(dāng)多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),比如操作同一張表時(shí),數(shù)據(jù)庫為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。
即要達(dá)到這么一種效果:對于任意兩個(gè)并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個(gè)事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。
4、持久性(Durability)持久性是指一個(gè)事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
擴(kuò)展資料
MyISAMMySQL5.0之前的默認(rèn)數(shù)據(jù)庫引擎,最為常用。擁有較高的插入,查詢速度,但不支持事務(wù)InnoDB事務(wù)型數(shù)據(jù)庫的首選引擎,支持ACID事務(wù),支持行級鎖定,MySQL5.5起成為默認(rèn)數(shù)據(jù)庫引擎BDB源自BerkeleyDB,事務(wù)型數(shù)據(jù)庫的另一種選擇,支持Commit和Rollback等其他事務(wù)特性Memory所有數(shù)據(jù)置于內(nèi)存的存儲引擎,擁有極高的插入,更新和查詢效率。
但是會占用和數(shù)據(jù)量成正比的內(nèi)存空間。并且其內(nèi)容會在MySQL重新啟動(dòng)時(shí)丟失Merge將一定數(shù)量的MyISAM表聯(lián)合而成一個(gè)整體,在超大規(guī)模數(shù)據(jù)存儲時(shí)很有用Archive非常適合存儲大量的獨(dú)立的,作為歷史記錄的數(shù)據(jù)。
因?yàn)樗鼈儾唤?jīng)常被讀取。Archive擁有高效的插入速度,但其對查詢的支持相對較差Federated將不同的MySQL服務(wù)器聯(lián)合起來,邏輯上組成一個(gè)完整的數(shù)據(jù)庫。非常適合分布式應(yīng)用Cluster/NDB高冗余的存儲引擎,用多臺數(shù)據(jù)機(jī)器聯(lián)合提供服務(wù)以提高整體性能和安全性。適合數(shù)據(jù)量大,安全和性能要求高的應(yīng)用