分佈式事務的四種解決方式: 前提:前創建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.添加事務日誌落庫操作。
分佈式事務實踐
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.