分佈式事務實踐

分佈式事務的四種解決方式:
前提:前創建1一個父級項目,再創建三個子級項目[eureka-center,bank1,bank2](註冊中心,工商銀行,中國銀行)

1.method 使用rocketMQ 消息通知[三張表:賬號表account_info,轉賬支付表account_pay,事務表bank1_duplication]
 示例: 用戶鳳凰小哥哥使用中國銀行bank2給工商銀行bank1轉賬
 步驟: 1.用戶輸入轉賬賬號 & 資金接收賬號 & 轉賬金額髮起請求
        2.減去轉賬賬號金額,增加轉賬支付表記錄
        3.發送rocketMQ消息給工商銀行
        4.兩種方式[4-1,rocketMQ自動監聽,4-2,主動查詢]:
        4-1.工商銀行rocketMQ[RocketmqListener]消息監聽器收到消息後,判斷事務是否執行過,進行增加金額金額修改數據
          入庫操作 & 添加日誌
        4-2.工商銀行主動查詢中國銀行的轉賬,進行金額修改數據入庫操作。
        [爲了保證避免重複轉賬操作,在修改之前先進行查找事務表,如果已經存在,則不做修改操作,
                不存在則進行修改入庫操作,然後插入事務信息表]。
 注意: 1.親測可用[由於4種方法,且代碼在一起,測試method1 時,將bank2 ProducerTxmsgListener
       類中的“執行本地事務,扣減金額”下一句註釋掉哦,不然會發生重複扣款操作。這一個類是方法四的操作]。               
        
2.method 使用Seata 分佈式事務中間件保證事務[account_info]
示例: 用戶鳳凰小哥哥使用中國銀行bank2給工商銀行bank1轉賬
步驟: 1.pom 文件引入spring-cloud-alibaba-seata
       2.用戶輸入轉賬賬號 & 資金接收賬號 & 轉賬金額髮起請求
       3.在bank2業務層加@Transactional &  @GlobalTransactional即可[資金轉出方]
       4.配置registry.conf & file.conf 文件
       4.由於需要搭建Seata-server,太麻煩,故不做實驗,知道這種方式即可
       
3.method 使用tcc兩階段進行分佈式事務
示例: 用戶鳳凰小哥哥使用中國銀行bank2給工商銀行bank1轉賬
步驟[資金轉出方]:
      1.pom 文件引入hmily-springcloud
      2.yml 文件配置hmily信息
      3.java讀取yml hmily 配置信息  
      4.創建三張表:local_try_log | local_confirm_log | local_cancel_log 
      5-1.在業務實現上加上註解@Hmily(confirmMethod="commit",cancelMethod="rollback")[commit & rollback 分別是兩個方法]:
      5-2.獲取全局事務id[String transId = HmilyTransactionContextLocal.getInstance().get().getTransId()]
      5-3.根據事務id 查詢local_try_log ,如果存在,則不進行操作。
      5-4.如果local_confirm_log | local_cancel_log 已經存在了,則不進行操作。
      5-5.進行賬戶扣減金額[同時插入local_try_log 日誌],如果報錯則拋出異常
      5-6.調用外部服務,進行[資金接收方]轉賬增加金額操作,如果報錯則拋出異常
      ----------------------------------------------------------------------
      commit method: 記錄日誌
      rollback method: 
      1.獲取全局事務id
      2.根據事務id 查詢local_cancel_log ,如果存在,則不進行操作。 
      3.根據事務id 查詢local_try_log ,   如果不存在,則不進行操作。
      4.進行賬戶增加金額[同時插入local_cancel_log 日誌]
   [資金接收方]
      1.pom 文件引入hmily-springcloud
      2.yml 文件配置hmily信息
      3.java讀取yml hmily 配置信息
      4-1.在業務實現上加上註解@Hmily(confirmMethod="commit",cancelMethod="rollback")[commit & rollback 分別寫兩個方法]:
      4-2.獲取全局事務id[String transId = HmilyTransactionContextLocal.getInstance().get().getTransId()] 
      4-3.分別實現commit & rollback 方法
      commit method:
      1.根據事務id 查詢local_confirm_log,如果存在,則不進行操作
      2.進行轉賬落庫操作,增加資金接收方金額[添加local_confirm_log日誌]
      rollback method: 記錄日誌
      
4.method: 使用事務+rocketMQ消息機制
示例: 用戶鳳凰小哥哥使用中國銀行bank2給工商銀行bank1轉賬
步驟[資金轉出方]:
     1.發送rocketMQ 消息
     2.消息監聽器ProducerTxmsgListener【executeLocalTransaction】執行扣減金額
    [資金接收方]:
     1.rocketMQ 消息監聽器監聽消息[TxmsgConsumer]  
     2.進行判斷事務是否已執行過
     3.資金接收方進行增加金額操作
     4.添加事務日誌落庫操作。  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章