您好,登錄后才能下訂單哦!
本篇內容介紹了“數據庫的2PC與3PC是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
數據庫事務有ACID四大特性,分布式事務從實質看也要滿足事務的基本特性(ACID),只是分布式事務相對于本地事務而言其表現形式有很大不同。
2PC ( Two-Phase Commit縮寫)即兩階段提交協議,是將整個事務流程分為兩個階段,準備階段(Prepare phase)、提交階段(commit phase),2是指兩個階段,P是指準備階段,C是指提交階段。用于解決分布式事務一致性的問題。
常用的Oracle及MySQL就支持2PC協議,2PC協議的二個階段如下:
準備階段(Prepare phase):事務管理器給每個參與者發送Prepare消息,每個數據庫參與者在本地執行事務,并寫本地的Undo/Redo日志,此時事務沒有提交。 (Undo日志是記錄修改前的數據,用于數據庫回滾,Redo日志是記錄修改后的數據,用于提交事務后寫入數據文件)
提交階段(commit phase):如果事務管理器收到了參與者的執行失敗或者超時消息時,直接給每個參與者發送回滾(Rollback)消息;否則,發送提交(Commit)消息;參與者根據事務管理器的指令執行提交或者回滾操作,并釋放事務處理過程中使用的鎖資源。注意:必須在最后階段釋放鎖資源。
準備階段:
事務管理器進行事務詢問。事務管理器(協調者)向數據庫參與者發送事務內容,詢問是否可以執行事務提交操作,并等待參與者響應。
參與者執行事務。(寫本地的Undo、Redo日志)
參與者反饋詢問的響應
提交階段:
事務管理器發送提交(commit)請求。
參與者正式提交事務,并釋放整個事務執行期間占用的事務資源。
參與者反饋事務提交結果,發送ACK消息。
事務管理器收到所有參與者反饋的ACK消息后,完成事務
準備階段與成功執行的步驟一樣:
事務管理器進行事務詢問,事務管理器(協調者)向數據庫參與者發送事務內容,詢問是否可以執行事務提交操作,并等待參與者響應。
參與者執行事務。(寫本地的Undo、Redo日志)
參與者反饋詢問的響應
提交階段:
事務管理器發送回滾(Rollback)請求,當收到參與者執行失敗或超時消息時。
參與者接收到Rollback請求后,利用準備階段記錄的Undo日志進行事務回滾操作,并釋放整個事務執行期間占用的事務資源。
參與者反饋事務提交結果。參與者在完成事務回滾之后,向協調者發送 Ack 信息。
協調者接收到所有參與者反饋的 Ack 信息后,完成事務中斷。
優點:原理簡單,便于實現。
缺點:
同步阻塞
在2PC協議的執行(commit)過程中,所有參與該事務操作的數據庫參與者都處于阻塞狀態,即各個參與者在等待其他參與者響應的過程中,無法進行其他操作。
單點問題
事務管理器在提交(commit)階段中非常重要,如果此時宕機,所有數據庫參與者處于一直鎖定數據庫資源的過程中。
數據不一致 事務管理器在提交(commit)階段向部分數據庫參與者發送了commit命令,部分參與者沒有發送,此時又宕機了,便只有部分數據庫參與者更新了數據,出現數據不一致的情況。
過于保守 務管理器在提交(commit)階段沒有設計較為完善的容錯機制,任意一個節點失敗都會導致整個事務的失敗。
3PC,全稱 “three phase commit”,是 2PC 的改進版,將 2PC 的 “提交事務請求Prepare” 過程一分為二(CanCommit、PreCommit),共形成了由 CanCommit、PreCommit和doCommit三個階段組成的事務處理協議。
1) 協調者進行事務詢問
協調者向所有的參與者發送一個包含事務內容的CanCommit請求,詢問是否可以執行事務提交操作,并開始等待 各參與者的響應。
2) 參與者向協調者反饋事務詢問
參與者在接收到來自協調者的包含了事務內容的CanCommit請求后,正常情況下,如果自身認為可以順利執行事 務,則反饋Yes響應,并進入預備狀態,否則反饋No響應。
協調者在得到所有參與者的響應之后,參與者在CanCommit反饋的是Yes,執行事務預提交:
1)協調者發送預提交請求(發出preCommit請求,并進入prepared階段)
2)參與者進行事務預提交(參與者接收到preCommit請求后,會執行事務操作,并將Undo和Redo信息記錄到事務日志中。)
3)各參與者向協調者反饋事務執行的結果(若參與者成功執行了事務操作,那么反饋Ack)
協調者在得到所有參與者的響應之后,參與者在CanCommit反饋的是No,中斷事務:
1)協調者發送中斷請求:(協調者向所有參與者發出abort請求。)
2)中斷事務(無論是收到來自協調者的abort請求或者等待協調者請求過程中超時,參與者都會中斷事務)
DoCommit階段完成真正的事務提交或者完成事務回滾。
在第二階段PreCommit階段收到ACK確認消息,則完成事務提交:
1)協調者發送提交DoCommit請求(協調者將從預提交狀態轉化為提交狀態,并向所有的參與者發送doCommit請求)
2)參與者進行事務提交(參與者接收到DoCommit請求后,會正式執行事務提交操作,并在完成提交之后釋放整個事務執行過程中占用的事務資源。)
3)各參與者向協調者反饋事務提交的結果(若參與者成功完成事務提交,那么反饋Ack響應)
4)完成事務(協調者接收到所有參與者反饋的Ack消息后,完成事務。)
在第二階段PreCommit階段超時中斷沒有收到ACK確認消息,則完成事務中斷:
1)協調者發送中斷請求(協調者向所有的參與者節點發送abort請求)
2)參與者進行事務回滾(根據記錄的Undo信息來執行事務回滾,并在完成回滾之后釋放整個事務執行期間占用的資源)
3)各參與者向協調者反饋事務回滾的結果(參與者在完成事務回滾后,向協調者發送Ack消息。)
4)中斷事務(協調者接收到所有參與者反饋的Ack消息后,中斷事務。)
注意:在DoCommit階段可能出現協調者宕機、協調者與參與者出現網絡故障;導致參與者接收不到協調者的DoCommit請求或Abort請求,參與者會在請求超時后,繼續進行事務提交。
2PC中只有協調者有超時機制(在一定時間內沒有收到參與者的消息則默認失敗);3PC中協調者及參與都設置了超時機制(參與者自身擁有超時機制,在超時后會自動進行本地commit從而進行釋放資源,防止2PC出現的同步阻塞問題)
3PC相對于2PC多設置了一個緩沖階段(PreCommit),保證在最后一個階段DoCommit前,各個參與者節點狀態是一致的
“數據庫的2PC與3PC是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。