中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

MySql中的事務(wù)詳細介紹

易寫科技事務(wù)是采用的Spring的編程式的事務(wù),我們x選擇的數(shù)據(jù)庫選是MySql,存儲引擎選用innoDB,innoDB對事務(wù)有著良好的支持。這篇文章我們詳細介紹事務(wù)相關(guān)的知識。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:國際域名空間、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、呈貢網(wǎng)站維護、網(wǎng)站推廣。

為什么要有事務(wù)?






事務(wù)廣泛的運用于訂單系統(tǒng)、銀行系統(tǒng)等多種場景。如果有以下一個場景:A用戶和B用戶是銀行的儲戶。現(xiàn)在A要給B轉(zhuǎn)賬500元。那么需要做以下幾件事:







1.
檢查A的賬戶余額>500元;







2. A賬戶扣除500元;







3. B賬戶增加500元;






正常的流程走下來,A賬戶扣了500,B賬戶加了500,皆大歡喜。那如果A賬戶扣了錢之后,系統(tǒng)出故障了呢?A白白損失了500,而B也沒有收到本該屬于他的500。以上的案例中,隱藏著一個前提條件:A扣錢和B加錢,要么同時成功,要么同時失敗。事務(wù)的需求就在于此。

事務(wù)是什么?






與其給事務(wù)定義,不如說一說事務(wù)的特性。眾所周知,事務(wù)需要滿足ACID四個特性。





1. A(atomicity)
原子性。一個事務(wù)的執(zhí)行被視為一個不可分割的最小單元。事務(wù)里面的操作,要么全部成功執(zhí)行,要么全部失敗回滾,不可以只執(zhí)行其中的一部分。





2. C(consistency)
一致性。一個事務(wù)的執(zhí)行不應(yīng)該破壞數(shù)據(jù)庫的完整性約束。如果上述例子中第2個操作執(zhí)行后系統(tǒng)崩潰,保證A和B的金錢總計是不會變的。




3. I(isolation)
隔離性。通常來說,事務(wù)之間的行為不應(yīng)該互相影響。然而實際情況中,事務(wù)相互影響的程度受到隔離級別的影響。文章后面會詳述。




4. D(durability)
持久性。事務(wù)提交之后,需要將提交的事務(wù)持久化到磁盤。即使系統(tǒng)崩潰,提交的數(shù)據(jù)也不應(yīng)該丟失。

事務(wù)的四種隔離級別






前文中提到,事務(wù)的隔離性受到隔離級別的影響。那么事務(wù)的隔離級別是什么呢?事務(wù)的隔離級別可以認(rèn)為是事務(wù)的"自私"程度,它定義了事務(wù)之間的可見性。隔離級別分為以下幾種:






1.READ UNCOMMITTED(未提交讀)。在RU的隔離級別下,事務(wù)A對數(shù)據(jù)做的修改,即使沒有提交,對于事務(wù)B來說也是可見的,這種問題叫臟讀。這是隔離程度較低的一種隔離級別,在實際運用中會引起很多問題,因此一般不常用。






2.READ COMMITTED(提交讀)。在RC的隔離級別下,不會出現(xiàn)臟讀的問題。事務(wù)A對數(shù)據(jù)做的修改,提交之后會對事務(wù)B可見,舉例,事務(wù)B開啟時讀到數(shù)據(jù)1,接下來事務(wù)A開啟,把這個數(shù)據(jù)改成2,提交,B再次讀取這個數(shù)據(jù),會讀到最新的數(shù)據(jù)2。在RC的隔離級別下,會出現(xiàn)不可重復(fù)讀的問題。這個隔離級別是許多數(shù)據(jù)庫的默認(rèn)隔離級別。






3.REPEATABLE READ(可重復(fù)讀)。在RR的隔離級別下,不會出現(xiàn)不可重復(fù)讀的問題。事務(wù)A對數(shù)據(jù)做的修改,提交之后,對于先于事務(wù)A開啟的事務(wù)是不可見的。舉例,事務(wù)B開啟時讀到數(shù)據(jù)1,接下來事務(wù)A開啟,把這個數(shù)據(jù)改成2,提交,B再次讀取這個數(shù)據(jù),仍然只能讀到1。在RR的隔離級別下,會出現(xiàn)幻讀的問題。幻讀的意思是,當(dāng)某個事務(wù)在讀取某個范圍內(nèi)的值的時候,另外一個事務(wù)在這個范圍內(nèi)插入了新記錄,那么之前的事務(wù)再次讀取這個范圍的值,會讀取到新插入的數(shù)據(jù)。Mysql默認(rèn)的隔離級別是RR,然而mysql的innoDB引擎間隙鎖成功解決了幻讀的問題。






4.SERIALIZABLE(可串行化)??纱谢歉叩母綦x級別。這種隔離級別強制要求所有事物串行執(zhí)行,在這種隔離級別下,讀取的每行數(shù)據(jù)都加鎖,會導(dǎo)致大量的鎖征用問題,性能最差。





為了幫助理解四種隔離級別,下面這張圖可以解釋一下:



不同隔離級別所面對的問題,看下圖:



很顯然,隔離級別越高,它所帶來的資源消耗也就越大(鎖),因此它的并發(fā)性能越低。準(zhǔn)確的說,在可串行化的隔離級別下,是沒有并發(fā)的。

所以說要針對不同的場景去設(shè)置不同的事務(wù)隔離級別。下面我們說下Mysql中的事務(wù)。

MySql中的事務(wù)






事務(wù)的實現(xiàn)是基于數(shù)據(jù)庫的存儲引擎。不同的存儲引擎對事務(wù)的支持程度不一樣。mysql中支持事務(wù)的存儲引擎有innoDB和NDB。innoDB是mysql默認(rèn)的存儲引擎,默認(rèn)的隔離級別是RR,并且在RR的隔離級別下更進一步,通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control
)解決不可重復(fù)讀問題,加上間隙鎖(也就是并發(fā)控制)解決幻讀問題。因此innoDB的RR隔離級別其實實現(xiàn)了串行化級別的效果,而且保留了比較好的并發(fā)性能。





事務(wù)的隔離性是通過鎖實現(xiàn),而事務(wù)的原子性、一致性和持久性則是通過事務(wù)日志實現(xiàn)。說到事務(wù)日志,不得不說的就是redo和undo。




1.redo log





在innoDB的存儲引擎中,事務(wù)日志通過重做(redo)日志和innoDB存儲引擎的日志緩沖(InnoDB Log Buffer)實現(xiàn)。事務(wù)開啟時,事務(wù)中的操作,都會先寫入存儲引擎的日志緩沖中,在事務(wù)提交之前,這些緩沖的日志都需要提前刷新到磁盤上持久化,這就是DBA們口中常說的“日志先行”(Write-Ahead Logging)。當(dāng)事務(wù)提交之后,在Buffer Pool中映射的數(shù)據(jù)文件才會慢慢刷新到磁盤。此時如果數(shù)據(jù)庫崩潰或者宕機,那么當(dāng)系統(tǒng)重啟進行恢復(fù)時,就可以根據(jù)redo log中記錄的日志,把數(shù)據(jù)庫恢復(fù)到崩潰前的一個狀態(tài)。未完成的事務(wù),可以繼續(xù)提交,也可以選擇回滾,這基于恢復(fù)的策略而定。






在系統(tǒng)啟動的時候,就已經(jīng)為redo log分配了一塊連續(xù)的存儲空間,以順序追加的方式記錄Redo Log,通過順序IO來改善性能。所有的事務(wù)共享redo log的存儲空間,它們的Redo Log按語句的執(zhí)行順序,依次交替的記錄在一起。如下一個簡單示例:






記錄1:<trx1, insert...>






記錄2:<trx2, delete...>






記錄3:<trx3, update...>






記錄4:<trx1, update...>






記錄5:<trx3, insert...>





2.undo log





undo log主要為事務(wù)的回滾服務(wù)。在事務(wù)執(zhí)行的過程中,除了記錄redo log,還會記錄一定量的undo log。undo log記錄了數(shù)據(jù)在每個操作前的狀態(tài),如果事務(wù)執(zhí)行過程中需要回滾,就可以根據(jù)undo log進行回滾操作。單個事務(wù)的回滾,只會回滾當(dāng)前事務(wù)做的操作,并不會影響到其他的事務(wù)做的操作。






以下是undo+redo事務(wù)的簡化過程






假設(shè)有2個數(shù)值,分別為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的任意一步系統(tǒng)宕機,事務(wù)未提交,該事務(wù)就不會對磁盤上的數(shù)據(jù)做任何影響。如果在8-9之間宕機,恢復(fù)之后可以選擇回滾,也可以選擇繼續(xù)完成事務(wù)提交,因為此時redo log已經(jīng)持久化。若在9之后系統(tǒng)宕機,內(nèi)存映射中變更的數(shù)據(jù)還來不及刷回磁盤,那么系統(tǒng)恢復(fù)之后,可以根據(jù)redo log把數(shù)據(jù)刷回磁盤。






所以,redo log其實保障的是事務(wù)的持久性和一致性,而undo log則保障了事務(wù)的原子性。

分布式事務(wù)






分布式事務(wù)的實現(xiàn)方式有很多,既可以采用innoDB提供的原生的事務(wù)支持,也可以采用消息隊列來實現(xiàn)分布式事務(wù)的最終一致性。這里我們主要聊一下innoDB對分布式事務(wù)的支持。

如圖,mysql的分布式事務(wù)模型。模型中分三塊:應(yīng)用程序(AP)、資源管理器(RM)、事務(wù)管理器(TM)。






應(yīng)用程序定義了事務(wù)的邊界,指定需要做哪些事務(wù);






資源管理器提供了訪問事務(wù)的方法,通常一個數(shù)據(jù)庫就是一個資源管理器;






事務(wù)管理器協(xié)調(diào)參與了全局事務(wù)中的各個事務(wù)。






分布式事務(wù)采用兩段式提交(two-phase commit)的方式。第一階段所有的事務(wù)節(jié)點開始準(zhǔn)備,告訴事務(wù)管理器ready。第二階段事務(wù)管理器告訴每個節(jié)點是commit還是rollback。如果有一個節(jié)點失敗,就需要全局的節(jié)點全部rollback,以此保障事務(wù)的原子性。





一般分布式事務(wù)在互聯(lián)網(wǎng)大的并發(fā)中效率是很低的,尤其是大型的分布式系統(tǒng)的,一些分布式的框架本身就不支持分布式的事務(wù),比如阿里巴巴的Dubbo,一般用一些異步的消息框架來處理,或者分析日志。當(dāng)然具體還得看業(yè)務(wù)需求,當(dāng)然事務(wù)的知識遠不止本文所說,本文僅做拋磚引玉,不如之處還請諒解。

網(wǎng)站標(biāo)題:MySql中的事務(wù)詳細介紹
當(dāng)前URL:http://www.rwnh.cn/article36/cgcjpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、移動網(wǎng)站建設(shè)、小程序開發(fā)、建站公司營銷型網(wǎng)站建設(shè)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
上林县| 双柏县| 新津县| 谷城县| 正蓝旗| 平陆县| 大邑县| 自治县| 集贤县| 胶南市| 沾益县| 昭通市| 通榆县| 龙川县| 沅陵县| 南丹县| 会理县| 田东县| 丰宁| 咸宁市| 巢湖市| 抚远县| 沙湾县| 青冈县| 建宁县| 濮阳县| 长武县| 河间市| 友谊县| 临猗县| 龙井市| 高唐县| 铜陵市| 伽师县| 廉江市| 阜康市| 赤城县| 柳江县| 北辰区| 神农架林区| 阜新|