這段時間一直在思考分佈式事務的實現,一開始的思路老是停留在應用層面上,後來通過查看相關資料才知道,要支持分佈式事務得須要數據庫的支持,也就仍是回到了數據庫層面,另外在Java裏面結合javax.sql擴展包裏面使用兩段提交協議能輕鬆支持分佈式事務。java
後來本身結合以前作過的一些項目,發現原來以前實現的功能已經利用消息隊列把分佈式事務拆解成單機事務了,雖然實時性可能沒有那麼強,可是正常狀況下,這種思路仍是比較好的一種解決方案。只是之前不知道這個概念,可是倒是實現了這個功能。sql
關於分佈式事務的拆解的分析,案例仍是上篇文章的案例,因爲上篇文章主要寫的重點是突出事務與併發的關係,這邊文章主要想寫分佈式事務如何拆解成單機事務來執行,場景仍是使用上篇文章的場景。數據庫
A系統處理一個事務後修改訂單狀態併發
經過ActiveMQ通知B系統,B系統收到通知後啓動一個事務來處理跟訂單相關的信息,再經過ActiveMQ告知A系統分佈式
A系統再啓動一個事務修改訂單狀態ide
假設訂單狀態正常由第一步驟到第三步驟的狀態變化爲pending---finishspa
假設上篇文章的bug咱們已經解決,那這個流程就是一個典型的分佈式事務拆解成單機事務的例子,把一個分佈式事務拆分紅A系統的兩個單機事務和B系統的一個單機事務。A系統裏面分別啓動了兩個事務來修改訂單狀態,第二個事務啓動的條件是B系統的事務執行完畢並收到確認消息以後。orm
然而這個流程可能有不少細節要注意,如:接口
B系統的事務執行失敗,A系統如何從新啓動整個流程隊列
B系統如何保證冪等性
A系統的第二個事務啓動失敗,A系統如何從新啓動整個流程
以上問題都是很好解決的咱們只需在應用程面多加一些異常處理機制便可保證整個流程執行順暢。在B系統裏面能夠根據轉態或者另外創建一張消息表以保證接口的冪等性。