本文是對分布式事務原理、規(guī)范的科普,主要圍繞兩階段提交協(xié)議展開。最后描述了在應用框架層面模擬兩階段提交協(xié)議的簡化設計。 1 事務/分布式事務1.1 事務事務是數(shù)據(jù)庫從一個穩(wěn)定狀態(tài)變遷到另一個穩(wěn)定狀態(tài)的保證,具備 ACID 這 4 個特性:
例如應用程序需要更新多條相關數(shù)據(jù)時就需要進行事務處理。
1.2 分布式事務與 XA 規(guī)范分布式事務是指會涉及到操作多個數(shù)據(jù)庫的事務,同樣必須保證 ACID。
其就是將對同一庫事務的概念擴大到了對多個庫的事務:對同一庫的 SQL 操作對應了分布式事務中對一個庫的事務。
X/Open XA 定義了分布式事務處理的規(guī)范,并由數(shù)據(jù)庫廠商在驅動層面進行實現(xiàn)。XA 規(guī)范的基礎是兩階段提交協(xié)議,并定義了分布式事務處理所涉及的角色:
可以這樣認為,事務管理器即事務處理中間件(分布式事務處理系統(tǒng));資源管理器即各個數(shù)據(jù)庫。
2 兩階段提交協(xié)議兩階段提交協(xié)議(Two-phase commit protocol, 2PC)將一次分布式事務處理劃分為兩個階段:預提交階段(也稱為準備階段或投票階段),提交階段。 2.1 預提交階段這是兩階段提交協(xié)議的第一個階段,分布式事務處理系統(tǒng)咨詢各個資源管理器是否可以提交本地事務,各個資源管理器會把這個咨詢過程寫入日志,以便進行回滾或提交。
當一個數(shù)據(jù)庫接收到咨詢后,它會將需要執(zhí)行的操作寫入日志,禁止其他寫入操作(鎖定資源)。 如果分布式事務中某數(shù)據(jù)庫預提交失敗或提交失敗,那該數(shù)據(jù)庫會根據(jù)日志進行自身的操作回滾,并解鎖。 2.2 提交階段分布式事務處理系統(tǒng)對各個資源管理器下達提交/回滾的指令,使整個分布式事務結束。
當一個數(shù)據(jù)庫接受到提交/回滾指令時,它將根據(jù)第一階段的日志進行提交/回滾處理。
兩階段提交協(xié)議可以在數(shù)據(jù)庫層面通過驅動支持,也可以在應用框架中按照其原理進行設計實現(xiàn)。 3 分布式事務應用框架使用數(shù)據(jù)庫驅動方式實現(xiàn)兩階段事務有兩個不足:
3.1 角色
3.2 交互時序兩階段提交時序: 因為系統(tǒng)在上述交互中不是絕對可靠的,所以需要一定的方式進行事務狀態(tài)恢復,保證所有參與者最終一致。
回查恢復時序: 3.3 關鍵點
參考 |
|
|