日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阿里沈询:分布式事务原理与实践

發(fā)布時(shí)間:2025/3/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里沈询:分布式事务原理与实践 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

直播回顧視頻:https://yq.aliyun.com/edu/lesson/play/508


事務(wù)簡(jiǎn)介

事務(wù)的核心是鎖和并發(fā),采用同步控制的方式保證并發(fā)的情況下性能盡可能高,且容易理解。這種方式的優(yōu)勢(shì)是方便理解;它的劣勢(shì)是性能比較低。

計(jì)算機(jī)可以簡(jiǎn)單的理解為一個(gè)標(biāo)準(zhǔn)的打字機(jī),盡管看起來計(jì)算機(jī)可以并行處理很多事情,但實(shí)際上每個(gè)CPU單位時(shí)間內(nèi)只能做一件事,要么讀取數(shù)據(jù)、要么計(jì)算數(shù)據(jù)、要么寫入數(shù)據(jù),所有的任務(wù)都可以看成這三件事的集合。計(jì)算機(jī)的這種特性引出了一個(gè)問題:當(dāng)多個(gè)人去讀、算、寫操作時(shí),如果不加訪問控制,系統(tǒng)勢(shì)必會(huì)產(chǎn)生沖突。而事務(wù)相當(dāng)于在讀、算、寫操作之外增加了同步的模塊,進(jìn)而保證只有一個(gè)線程進(jìn)入事務(wù)當(dāng)中,而其他線程不會(huì)進(jìn)入。

單個(gè)事務(wù)單元

事務(wù)的四大特性分別是:原子型、一致性、隔離性和持久性。其中原子性指的是事務(wù)中包含的所有操作要么全做,要么全不做;一致性是指在事務(wù)開始以前,數(shù)據(jù)庫處于一致性的狀態(tài),事務(wù)結(jié)束后,數(shù)據(jù)庫也必須處于一致性的狀態(tài);隔離性要求系統(tǒng)必須保證事務(wù)不受其他并發(fā)執(zhí)行的事務(wù)的影響;持久性是指一個(gè)事務(wù)一旦成功完成,它對(duì)數(shù)據(jù)庫的改變必須是永久的,即使是在系統(tǒng)遇到故障的情況下也不會(huì)丟失,數(shù)據(jù)的重要性決定了事務(wù)的持久性的重要。

??

事務(wù)單元是通過Begin-Traction,然后CommitBegin-Traction、CommitRollback之間所有針對(duì)數(shù)據(jù)的寫入、讀取的操作都應(yīng)該添加同步訪問),BeginCommit之間就是一個(gè)同步的事務(wù)單元。例如,BobSmith 100塊錢就是一個(gè)事務(wù)單元,這個(gè)過程中有很多步操作,具體如上圖所示;但對(duì)業(yè)務(wù)來說,僅是一個(gè)轉(zhuǎn)賬的操作。

一組事務(wù)單元

?

當(dāng)三個(gè)賬戶都在進(jìn)行轉(zhuǎn)賬操作時(shí),每個(gè)操作都涉及Smith賬戶,所有的事務(wù)都會(huì)排隊(duì),形成一組事務(wù)單元。

事務(wù)單元之間的Happen-Before關(guān)系中的四種可能性:讀寫、寫讀、讀讀、寫寫。所有事務(wù)之間的關(guān)系都可以抽象成這四種之一,來對(duì)應(yīng)現(xiàn)在所有的業(yè)務(wù)邏輯處理。在此基礎(chǔ)之上,需要用最快的速度處理多個(gè)事務(wù)單元之間的關(guān)系,同時(shí)還能保障這四種操作的邏輯順序。

單個(gè)事務(wù)單元的其他例子

除了轉(zhuǎn)賬操作是事務(wù)單元外,諸如商品要建立一個(gè)基于GMT_Modified的索引、從數(shù)據(jù)庫中讀取一行記錄、向數(shù)據(jù)庫中寫入一行記錄,同時(shí)更新這行記錄的所有索引、刪除整張表等都是一個(gè)事務(wù)單元。


事務(wù)單元的實(shí)現(xiàn)方式

?

Two Phase Lock2PL)是數(shù)據(jù)庫中非常重要的一個(gè)概念。數(shù)據(jù)庫操作Insert、UpdateDelete都是先讀再寫的操作,例如Insert操作是先讀取數(shù)據(jù),讀取之后判讀數(shù)據(jù)是否存在,如果不存在,則寫入該數(shù)據(jù),如果數(shù)據(jù)存在,則返回錯(cuò)誤。假設(shè)在該場(chǎng)景下沒有讀操作,只是單純寫入數(shù)據(jù),則數(shù)據(jù)本身并沒有事務(wù)操作,Delete、Update操作與之類似。數(shù)據(jù)庫利用這些操作的特性,在每一次查詢過程中,只要查到數(shù)據(jù),就會(huì)在該數(shù)據(jù)上加鎖。理論上,所有被讀取的數(shù)據(jù)都已加鎖,不會(huì)再被其他人讀到,也就是說對(duì)數(shù)據(jù)進(jìn)行的中間操作狀態(tài)對(duì)所有人都不可見,當(dāng)所有中間狀態(tài)完成后,提交操作時(shí),解開鎖,此時(shí)數(shù)據(jù)對(duì)所有系統(tǒng)可見,例如在轉(zhuǎn)賬過程中,所有人只能看到兩種狀態(tài):開始時(shí),A有錢,B沒錢;結(jié)束時(shí),B有錢,A沒錢,而中間A減掉錢,B尚未加上錢的狀態(tài)被鎖隱藏掉了,這個(gè)操作就是數(shù)據(jù)庫中處理事務(wù)的最標(biāo)準(zhǔn)的方式。如上圖所示:事務(wù)中的Trx2JoeLock)與其他事務(wù)不相關(guān),因此可以并行執(zhí)行;Trx1需要Lock兩個(gè)數(shù)據(jù)BoblockSmithlock,而Trx3同樣需要Lock這兩個(gè)數(shù)據(jù),因此Trx3必須等待,且等待在Boblock上;Joe事務(wù)會(huì)先結(jié)束,Trx3會(huì)等到Trx1完成后才會(huì)開始。


處理事務(wù)的常見方法

處理事務(wù)的常見方法有排隊(duì)法、排他鎖、讀寫鎖、MVCC等方式,下面來一一解析。

排隊(duì)法

?

事務(wù)處理中最重要也是最簡(jiǎn)單的方案是排隊(duì)法,單線程地處理一堆數(shù)據(jù)。在Redis中,如果數(shù)據(jù)全部在內(nèi)存中,則單線程處理所有Put、Get操作效率最高。這是因?yàn)槎嗑€程本質(zhì)是CPU模擬多個(gè)線程,這種模擬是以上下文切換為代價(jià),而對(duì)于內(nèi)存的數(shù)據(jù)庫來說,沒有上下文切換時(shí)效率最高。因此,單個(gè)CPU綁定一塊內(nèi)存的數(shù)據(jù),針對(duì)這塊數(shù)據(jù)做多次讀寫操作時(shí)都是在單個(gè)CPU上完成的,單線程處理方式在內(nèi)存的情況是效率是最優(yōu)的。

那么什么時(shí)候事務(wù)需要用到多線程呢?這個(gè)問題的本質(zhì)取決于下層所使用的存儲(chǔ),如果是內(nèi)存操作,則可以動(dòng)態(tài)地申請(qǐng)和銷毀內(nèi)存塊;而磁盤的IOPS很低,但吞吐量很高。如果一個(gè)場(chǎng)景涉及多次讀寫操作,單線程可以很高的效率對(duì)于內(nèi)存進(jìn)行讀寫操作;但是,由于磁盤的IOPS僅為內(nèi)存的幾千分之一,如果依舊用操作內(nèi)存的方式操作磁盤,那系統(tǒng)的整體性能將會(huì)很低,這意味著必須將大量的讀寫操作聚合成一個(gè)Batch后再提交時(shí)才能達(dá)到較好的性能。而將大量請(qǐng)求攢到一起的方式一是異步,也就是請(qǐng)求本身和線程不綁定,線程可以不Block(本質(zhì)來說還是一種多線程的方式),處理完一個(gè)線程后再處理其他線程。這種做法的核心是將大量不同的請(qǐng)求提交到一個(gè)Buffer中,再由該Buffer統(tǒng)一讀取或者寫入磁盤,從而提高效率。在慢速設(shè)備中,多線程或異步非常常見,在設(shè)計(jì)系統(tǒng)時(shí),面對(duì)磁盤、網(wǎng)絡(luò)、SSD等慢速設(shè)備必須考慮使用多線程。

排他鎖

?

有些場(chǎng)景不適合用單線程操作,可以利用排他鎖的方式來快速隔離并發(fā)讀寫事務(wù)。數(shù)據(jù)庫中有一些事務(wù)單元是共享的,如圖中的事務(wù)單元1是共享的,事務(wù)單元2/3共享數(shù)據(jù);針對(duì)事務(wù)單元2/3共享數(shù)據(jù)的所有讀寫Block住,事務(wù)單元1單獨(dú)用一個(gè)鎖來控制,用這種方式完成系統(tǒng)的訪問控制。

讀寫鎖

?

如果是一個(gè)只讀的事務(wù),例如只對(duì)數(shù)據(jù)進(jìn)行查詢操作,在該過程中數(shù)據(jù)一定不被修改,因此多個(gè)查詢操作可以并行執(zhí)行,因此一種針對(duì)讀讀場(chǎng)景的優(yōu)化自然而然產(chǎn)生——讀寫鎖。讀寫鎖的核心是在多次讀的操作中,同時(shí)允許多個(gè)讀者來訪問共享資源,提高并發(fā)性。

MVCC

?

在最初的數(shù)據(jù)庫事務(wù)實(shí)現(xiàn)中是不存在MVCC的,它是Oracle在八十年代新加的功能,本質(zhì)是Copy On Write,也就是每次寫都是以重新開始一個(gè)新的版本的方式寫入數(shù)據(jù),因此,數(shù)據(jù)庫中也就包含了之前的所有版本。在數(shù)據(jù)讀的過程中,先申請(qǐng)一個(gè)版本號(hào),如果該版本號(hào)小于正在寫入的版本號(hào),則數(shù)據(jù)一定可以查詢到,無需等到新版本完全寫完即可返回查詢結(jié)果。這種方式可以在讀讀不阻塞的前提下,實(shí)現(xiàn)讀寫/寫讀不阻塞,盡可能保證所有的讀操作并行,而寫操作串行。


事務(wù)的調(diào)優(yōu)原則

事務(wù)的調(diào)優(yōu)的思路是在不影響業(yè)務(wù)應(yīng)用的前提下:

第一,盡可能減少鎖的覆蓋范圍,例如Myisam表鎖到Innodb的行鎖就是一個(gè)減少鎖覆蓋范圍的過程;對(duì)于原位鎖(排他鎖、讀寫鎖等)可變?yōu)?/font>MVCC多版本(本質(zhì)仍然是減少鎖的范圍)。

第二,增加鎖上可并行的線程數(shù),例如讀鎖和寫鎖的分離,允許并行讀取數(shù)據(jù)。

第三,選擇正確鎖類型,其中悲觀鎖適合并發(fā)爭(zhēng)搶比較嚴(yán)重的場(chǎng)景;樂觀鎖適合并發(fā)爭(zhēng)搶不太嚴(yán)重的場(chǎng)景。


下期分享預(yù)告:

從單機(jī)事務(wù)到分布式事務(wù):分布式事務(wù)的目標(biāo)是有完整的事務(wù)支持,可以按需像單機(jī)事務(wù)一樣的操作方式;可以按需無線擴(kuò)展。但這僅僅是夢(mèng),因?yàn)槿菀桌斫獾哪P屯阅芏疾缓?#xff0c;性能好的模型往往都不容易理解。具體內(nèi)容敬請(qǐng)期待。

總結(jié)

以上是生活随笔為你收集整理的阿里沈询:分布式事务原理与实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。