大白話聊聊分布式事務(wù)
什么是分布式事務(wù)
簡單的來說就是模蜡,一個大的操作由兩個或者更多的小的操作共同完成漠趁。而這些小的操作又分布在不同的網(wǎng)絡(luò)主機上。這些操作哩牍,要么全部成功執(zhí)行棚潦,要么全部不執(zhí)行。
拿轉(zhuǎn)賬的例子來說下什么是分布式事務(wù)膝昆。張三和李四在不同的城市丸边,存儲他們賬戶信息的服務(wù)器也在不同的網(wǎng)絡(luò)主機上叠必。張三有30元錢,李四有30元錢妹窖。張三給李四轉(zhuǎn)賬5元就是一個事務(wù)纬朝。完成這個事務(wù),需要兩個操作骄呼。首先得從張三賬戶上扣5元共苛,然后再給李四賬戶上加5元。事務(wù)執(zhí)行完畢后蜓萄,必須是兩個操作都執(zhí)行成功隅茎,要么都失敗。
事務(wù)的特性
分布式事務(wù)本身就是事務(wù)嫉沽,所以也有事務(wù)的特性辟犀。事務(wù)有四個特征ACID:
A:原子性(Atomicity)
事務(wù)中的各個操作單元要么全部做,要么就全部不做绸硕。不能事務(wù)執(zhí)行后堂竟,處于只做一半的狀態(tài)。
C:一致性(Consistency)
事務(wù)執(zhí)行后玻佩,必須由一個一致狀態(tài)變?yōu)榱硗庖粋€一致狀態(tài)出嘹。
I:隔離性(Isolation)
事務(wù)之間不能相互干擾。
D:持久性(Durability)
一旦事務(wù)完成咬崔,對于數(shù)據(jù)的變更是永久的税稼。
分布式事務(wù)實現(xiàn)方式
下面我們就以上面轉(zhuǎn)賬的例子來說下實現(xiàn)分布式事務(wù)的幾種方式。
兩階段提交
兩階段提交的大概流程:
第一階段:
正常情況下的操作過程如下:
在第一階段刁赦,主要是事務(wù)管理者(經(jīng)理)發(fā)起事務(wù)娶聘,讓各個事務(wù)資源方(職員甲乙)確認資源是否滿足,并做預處理(凍結(jié))甚脉。資源方的操作有可能失敗也可能成功。如铆农,張三賬戶不足5元錢牺氨,沒辦法凍結(jié),就是失敗墩剖。資源方把操作結(jié)果反饋給事務(wù)管理者猴凹。
異常情況下的操作過程如下:
如果預提交過程中出現(xiàn)任何問題,導致事務(wù)不能執(zhí)行岭皂。將會通知資源方進行撤銷預提交操作郊霎。
第二階段:
如果是職員甲和職員乙都告訴經(jīng)理,操作成功了爷绘。
正常情況下的操作過程如下:
這個時候书劝,張三賬戶上的金額是25元进倍。李四賬戶上的金額是35元。
異常情況下的操作過程如下:
這個時候购对,張三賬戶上的金額是30元猾昆。李四賬戶上的金額也是30元。
總而言之骡苞,事務(wù)的執(zhí)行會分為預提交和提交兩步進行垂蜗。任何一個小操作出問題,導致事務(wù)不能完成解幽,將會進行回滾操作贴见。
兩階段提交需要注意的
兩階段提交,要有一個事務(wù)管理者協(xié)調(diào)各方的操作躲株。各方對資源的占用要到整個事務(wù)結(jié)束后才能釋放片部。這樣會影響事務(wù)的效率。當并發(fā)量大的時候徘溢,系統(tǒng)的性能會嚴重下滑吞琐。
事務(wù)管理者和資源方存在通信。有可能存在通信不通暢然爆。如站粟,職員甲接受到扣錢的命令后,職員甲扣完了錢曾雕。由于電話故障等原因奴烙,導致沒辦法通知經(jīng)理已經(jīng)操作成功。因此剖张,各方還要處理通信超時問題切诀。
整個流程需要事務(wù)管理者協(xié)調(diào)各個資源方進行操作。但是搔弄,事務(wù)管理者可能出現(xiàn)問題幅虑。導致沒辦法進行協(xié)調(diào)。如顾犹,經(jīng)理生病了倒庵。
注意冪等性問題§潘ⅲ可能存在對資源方重復調(diào)用的情況擎宝。這種情況下,資源方被調(diào)用多次和調(diào)用一次的效果要一樣浑玛。如上例中绍申,經(jīng)理第二次通知職員甲扣5元的時候,職員甲要像上次一樣,告訴經(jīng)理扣款已經(jīng)完成极阅。但是胃碾,職員甲不能再進行扣款的動作。
基于消息實現(xiàn)
基于消息的實現(xiàn)大概過程如下:
基于消息的分布式事務(wù)實現(xiàn)中涂屁,引入了消息中間件(助理)书在,負責消息的傳遞和事務(wù)執(zhí)行狀態(tài)的詢問。這樣就降低了系統(tǒng)間的耦合度拆又。
為什么職員甲在進行扣款前儒旬,要告訴助理?主要是怕自己扣款成功了帖族,又忘記告訴助理栈源。這個時候,助理也就沒辦法通知職員乙操作了竖般。告訴助理后甚垦,如果職員甲忘記了,助理可以詢問職員甲涣雕,是否執(zhí)行成功艰亮。進而決定是否該通知職員乙進行加錢操作。
如果職員甲扣款失敗挣郭,則應(yīng)該通知助理迄埃。助理在這種情況下,就不英再通知職員乙加錢兑障。
基于消息實現(xiàn)的問題
基于消息的分布式事務(wù)實現(xiàn)侄非,講究的是最終一致性。也即所有的本地事務(wù)執(zhí)行完畢后流译,整個狀態(tài)的一致逞怨。
整個事務(wù)一般不會有回滾操作。如福澡,當職員乙操作失敗的時候叠赦,職員應(yīng)該是再次通知職員乙重試。