分佈式事務解決方案:@Transactional註解+log記錄操作實現

說明:

在分佈式中如訂單,賬戶,庫存系統中,數據庫獨立,這時需要分佈式事務解決。

框架:

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倉庫地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章