Distributed Transactions
- 與以前類似的想法,但是:
- 狀態(tài)遍布服務(wù)器(甚至可能是WAN)
- 希望啟用單個(gè)事務(wù)來讀取和更新全局狀態(tài),同時(shí)保持ACID屬性
- 總體思路:
- 客戶端啟動(dòng)事務(wù)。利用“協(xié)調(diào)員”
- 所有其他相關(guān)的服務(wù)器作為“參與者”
- 協(xié)調(diào)員分配唯一的交易ID(TID)
2-Phase commit
- 準(zhǔn)備和投票
- 參與者找出所有狀態(tài)變化
- 每個(gè)決定是否可以完成交易
- 與協(xié)調(diào)員溝通
- 提交
- 協(xié)調(diào)員向參與者進(jìn)行廣播:COMMIT / ABORT
- 如果COMMIT,參與者進(jìn)行相應(yīng)的狀態(tài)更改
實(shí)現(xiàn)
- 作為一組消息來實(shí)現(xiàn)
- 協(xié)調(diào)員和參與者之間
- 消息在第一階段
- A:協(xié)調(diào)員向參與者發(fā)送“CanCommit?”
- B:參與者回應(yīng):“投票提交”或“投票棄權(quán)”
- 消息在第二階段
- A: 如果任何參與者“VoteAbort”交易中止。 協(xié)調(diào)員向所有人發(fā)送“DoAbort”=>釋放鎖定
- B:否則,向所有人發(fā)送“DoCommit”=>完成交易
Example for 2PC
- 服務(wù)器A處銀行的帳戶“i”,服務(wù)器B處的“j”。

Server A would implement transaction

iServer B would implement transaction
服務(wù)器B可以假設(shè)“i”的賬戶有足夠的錢,否則整個(gè)交易將中止
怎么鎖定? 個(gè)人參與者鎖
- 在準(zhǔn)備過程開始時(shí)獲取鎖定,在提交/中止釋放
Deadlocks and Livelocks
- 分布式的死鎖
- 跨服務(wù)器的事務(wù)對鎖的循環(huán)依賴性
- 在2PC中,如果參與者不能響應(yīng)投票請求(例如仍在等待其本地資源上的鎖)
- 處理超時(shí)。 參與者超時(shí),然后投票中止。 再次重試交易。
- 解決死鎖問題
- 但是,LIVELOCK的危險(xiǎn) - 不斷嘗試!
總結(jié)
- 分布式一致性管理
- ACID屬性可取
- 單個(gè)服務(wù)器的情況:使用鎖,在使用兩階段鎖定(嚴(yán)格的2PL,嚴(yán)格的2PL嚴(yán)格)的情況下,對鎖的事務(wù)性支持
- 多服務(wù)器分布式情況:使用分階段事務(wù)的兩階段提交。 需要協(xié)調(diào)員來管理來自參與者的消息。
Two-Phase Commit (1)

The finite state machine
(a) The finite state machine for the coordinator in 2PC.
(b) The finite state machine for a participant.
Coordinator/Participant can be blocked in 3 states:
- Participant: Waiting in INIT state for VOTE_REQUEST
- Coordinator: Blocked in WAIT state, listening for votes
- Participant: blocked in READY state, waiting for global vote
Two-Phase Commit (2)
- 如果“READY”參與者沒有收到全局提交呢? 不能中止=>找出協(xié)調(diào)員可能發(fā)送了什么消息。
- 方法:詢問其他參與者
- 對任何參與者的回應(yīng)采取行動(dòng)
-
例如。 P處于READY狀態(tài),詢問其他“Q”參與者
image.png
-
- 對任何參與者的回應(yīng)采取行動(dòng)
如果每個(gè)人都處于“ready”狀態(tài),則協(xié)議模塊用于協(xié)調(diào)員(例如,如果協(xié)調(diào)員沒有響應(yīng)或已經(jīng)崩潰?。?。
Two-Phase Commit (3)
- 為了恢復(fù),必須將狀態(tài)保存到永久存儲(chǔ)器(例如日志),以在故障之后重新啟動(dòng)/恢復(fù)。
- 參與者(INIT):安全到當(dāng)?shù)刂兄?,通知協(xié)調(diào)員
- 參與者(READY):聯(lián)系其他人
- 協(xié)調(diào)器(WAIT):重新發(fā)送VOTE_REQ
- 協(xié)調(diào)員(等待/決定):重新傳送VOTE_COMMIT
協(xié)調(diào)員必須小心跟蹤兩個(gè)狀態(tài):
如果它記錄了進(jìn)入等待狀態(tài)并且沒有回來所有的響應(yīng),它可以重新發(fā)送VOTE_REQ
如果它已經(jīng)恢復(fù)已經(jīng)在第二階段做出決定,那么這個(gè)決定必須被記錄下來并且被重新發(fā)送。
2PC: Actions by Coordinator

iActions by Coordinator

Actions by Participant
Handling Decision Request

Handling Decision Request
請注意,參與者只有在達(dá)成全球決定并將其付諸日志時(shí)才能幫助他人。
如果每個(gè)人都收到VOTE_REQ,協(xié)調(diào)員崩潰怎么辦?
