說明:
在分佈式中如訂單,賬戶,庫存系統中,數據庫獨立,這時需要分佈式事務解決。
框架:
SpringBoot+mybatis+dubbo+zk+mysql
數據庫 | 表名 |
---|---|
transactiondb(log) | transaction-log |
account(賬戶) | account |
order(訂單) | order |
goods(商品) | goods |
業務場景
扣款(account)->創建訂單(order)->減少庫存(goods)
操作簡介:
1.採用log日誌(transaction-log)來記錄業務系統(account,order,goods)操作成功或者失敗;
2.業務系統完成操作之後檢查日誌系統失敗個數,存在失敗進行回滾;
具體實現:
- 1.生成事務日誌表(centre_no,count,prepare_count,failed_count)
TransactionLog transactionLog = new TransactionLog(); transactionLog.setCentreNo(no);//記錄事務整天操作關聯的日誌表 transactionLog.setCount(3);//此事務關聯幾個中心操作,此業務場景3 transactionLog.setPrepareCount(3);//未處理的業務數,初始時等於count transactionLog.setFailedCount(0)//失敗次數(默認0) transactionLogService.addTransactionLog(transactionLog);
- 2 .業務系統操作(賬戶,訂單,庫存)
操作簡介:dubbo+zk實現rpc遠程服務調用,分四部分: 注:--修改失敗次數:(prepare_count=0,failed_count=1) --減少準備操作次數:(prepare_count-1) --也正是因爲2.3需要結合其他業務減少準備操作次數,所以業務操作方法(或服務)需要使用異步 ( <dubbo:method name="addOrder" async="true" />) 2.1.校驗回滾(校驗數據,如庫存,賬戶金額) 不滿足:修改失敗次數,並拋異常回滾 2.2.業務系統操作處理(如扣款,創建訂單,扣庫存,捕獲異常) 2.2.1失敗(捕獲異常): 修改失敗次數,並拋異常回滾 2.2.2成功:修改失敗次數 2.3.查詢失敗次數(當1,2任意步驟失敗,都可以修改失敗次數爲1) 實現了兩種返回:(成功:0,失敗:1/拋異常) 實現: while循環,跳出循環條件: 2.3.1 失敗:failed_count>0 (return:1/拋異常) 2.3.2 成功:prepare_count<=0(業務系統操作2步驟全部完成) 並且 failed_count==0 2.4.處理查詢失敗次數返回值 成功:你懂得 失敗:1->判斷返回值如果等於1,拋異常 捕獲異常->catch塊中,拋異常(總而言之就是拋異常) ps:忘說了異常爲:RuntimeException
項目已經放在github倉庫歡迎大家前往下載,也希望能夠一起探討,提出不足與改進。github倉庫地址。