天天看點

分布式事務之二階段送出、三階段送出

分布式系統中的每個節點都能知道自己的事物是成功還是失敗,但是不知道其他節點的操作結果。要保證多個節點的事務性,就需要一個中間者來協調這些機器,由中間者來決定事物的送出。2pc和3pc應運而生。

2PC

過程如下

  1. 中間者向每個節點發送事物請求
  2. 每個節點執行事物操作,将undo和redo記錄下來,并将自己的執行結果傳回給中間者
  3. 如果都執行成功,則中間者向各個節點發送送出請求,節點們執行事務送出操作,并發送ack給中間者;如果有任意一個節點失敗,則中間者向各個節點發送復原請求,節點們執行復原操作,并發送ack給中間者。

他的缺點也很明顯:中間者是單點,節點會阻塞,可能隻有一部分節點收到commit請求

3PC

過程如下

  1. 中間者向所有節點發送cancommit請求,詢問是否可以執行事務送出操作
  2. 如果所有節點都傳回成功,中間者會發送precommit請求,節點們會執行事務操作,将undo和redo記錄下來,并将自己的執行結果傳回給中間者,等待最後的送出或者終止;如果任一節點傳回失敗或者中間者在逾時時間内沒收到節點的傳回,會發送終止請求,節點們中斷事務。如果節點們在逾時時間内沒收到中間者發送的precommit階段的請求(包括正常的precommit請求或者中斷請求),也會中斷事物。
  3. 此階段在成功發送precommit請求之後。如果任一節點傳回失敗或者中間者在逾時時間内沒收到節點的傳回,中間者會向所有節點發送終止請求,節點們收到終止請求會中斷事物,利用undo執行復原操作,傳回ack;如果全都傳回成功,中間者發送docommit請求,節點們正式送出事務,傳回ack。因為各種原因導緻的節點無法在逾時時間内收到中間者發送的送出或者終止請求,節點都會進行事務送出

缺點也很明顯了:在第三步如果中間者發送的終止操作無法在逾時時間内到達節點的話,節點也會執行送出,資料會不一緻

繼續閱讀