日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

借助Nacos高效配置與實踐Seata事務的TCC模式

來源: 責編: 時間:2024-02-01 12:45:10 250觀看
導讀實現TCC 模式TCC模式與AT模式非常相似,每階段都是獨立事務,不同的是TCC通過人工編碼來實現數據恢復。需要實現三個方法:Try:資源的檢測和預留;Confirm:完成資源操作業務;要求 Try 成功 Confirm 一定要能成功。Cancel:預留資源

實現

TCC 模式

TCC模式與AT模式非常相似,每階段都是獨立事務,不同的是TCC通過人工編碼來實現數據恢復。需要實現三個方法:XNo28資訊網——每日最新資訊28at.com

  • Try:資源的檢測和預留;
  • Confirm:完成資源操作業務;要求 Try 成功 Confirm 一定要能成功。
  • Cancel:預留資源釋放,可以理解為try的反向操作。

流程分析

圖片圖片XNo28資訊網——每日最新資訊28at.com

階段一(Try):檢查余額是否充足,如果充足則凍結金額增加30元,可用余額扣除30XNo28資訊網——每日最新資訊28at.com

圖片圖片XNo28資訊網——每日最新資訊28at.com

圖片圖片XNo28資訊網——每日最新資訊28at.com

此時,總金額 = 凍結金額 + 可用金額,數量依然是100不變,事務直接提交無需等待其它事務。XNo28資訊網——每日最新資訊28at.com

階段二(Confirm) :假如要提交,則凍結金額扣減30XNo28資訊網——每日最新資訊28at.com

圖片圖片XNo28資訊網——每日最新資訊28at.com

確認可以提交,不過之前可用金額已經扣減過了,這里只要清除凍結金額就好了,此時,總金額 = 凍結金額 + 可用金額 = 0 + 70 = 70XNo28資訊網——每日最新資訊28at.com

階段二(Cancel):如果要回滾,則凍結金額扣減30,可用余額增加30XNo28資訊網——每日最新資訊28at.com

圖片圖片XNo28資訊網——每日最新資訊28at.com

需要回滾,那么就要釋放凍結金額,恢復可用金額XNo28資訊網——每日最新資訊28at.com

Seata的TCC模型

圖片圖片XNo28資訊網——每日最新資訊28at.com

代碼樣例

配置和依賴參考之前《利用Nacos實現Seata事務模式(XA與AT)的快速配置與靈活切換》即可XNo28資訊網——每日最新資訊28at.com

bank3:XNo28資訊網——每日最新資訊28at.com

聲明TCC接口@LocalTCCpublic interface AccountInTcc {    @TwoPhaseBusinessAction(name = "prepareDeductMoney", commitMethod = "commitDeductMoney", rollbackMethod = "rollbackDeductMoney")    boolean prepareDeductMoney(BusinessActionContext businessActionContext,                               @BusinessActionContextParameter(paramName = "accountNo")String accountNo,                               @BusinessActionContextParameter(paramName = "amount")Double amount);    /**     * 提交扣款     * 二階段confirm確認方法、可以另命名,但要保證與commitMethod一致     */    boolean commitDeductMoney(BusinessActionContext businessActionContext);    /**     * 回滾扣款     * 二階段回滾方法,要保證與rollbackMethod一致     */    boolean rollbackDeductMoney(BusinessActionContext businessActionContext);}

具體實現:XNo28資訊網——每日最新資訊28at.com

@Componentpublic class AccountInTccImpl implements AccountInTcc {    @Autowired    private AccountInfoMapper accountInfoMapper;    @Transactional    @Override    public boolean prepareDeductMoney(BusinessActionContext businessActionContext, String accountNo, Double amount) {        String xid = businessActionContext.getXid();        // 冪等性判斷        if (TccActionResultWrap.hasPrepareResult(xid)) {            return true;        }        // 避免空懸掛,已經執行過回滾了就不能再預留資源        if (TccActionResultWrap.hasRollbackResult(xid) || TccActionResultWrap.hasCommitResult(xid)) {            return false;        }        // 預留資源        boolean result = accountInfoMapper.prepareDeductMoney(accountNo,amount) > 0;        // 記錄執行結果,以便回滾時判斷是否是空回滾        TccActionResultWrap.prepareSuccess(xid);        System.out.println("============prepare==============");        return result;    }    // 保證提交邏輯的原子性    @Transactional    @Override    public boolean commitDeductMoney(BusinessActionContext businessActionContext) {        String xid = businessActionContext.getXid();        // 冪等性判斷        if (TccActionResultWrap.hasCommitResult(xid)) {            return true;        }        Map<String, Object> actionContext = businessActionContext.getActionContext();        String accountNo = (String) actionContext.get("accountNo");        BigDecimal amount = (BigDecimal) actionContext.get("amount");        // 執行提交操作,扣除預留款        boolean result = accountInfoMapper.commitDeductMoney(accountNo,amount.doubleValue()) > 0;        // 清除預留結果        TccActionResultWrap.removePrepareResult(xid);        // 設置提交結果        TccActionResultWrap.commitSuccess(xid);        System.out.println("============commit==============");        return result;    }    @Transactional    @Override    public boolean rollbackDeductMoney(BusinessActionContext businessActionContext) {        String xid = businessActionContext.getXid();        // 冪等性判斷        if (TccActionResultWrap.hasRollbackResult(xid)) {            return true;        }        // 沒有預留資源結果,回滾不做任何處理;        if (!TccActionResultWrap.hasPrepareResult(xid)) {            // 設置回滾結果,防止空回滾            TccActionResultWrap.rollbackSuccess(xid);            return true;        }        // 執行回滾        Map<String, Object> actionContext = businessActionContext.getActionContext();        String accountNo = (String) actionContext.get("accountNo");        BigDecimal amount = (BigDecimal) actionContext.get("amount");        boolean result = accountInfoMapper.rollbackDeductMoney(accountNo,amount.doubleValue()) > 0;        // 清除預留結果        TccActionResultWrap.removePrepareResult(xid);        // 設置回滾結果        TccActionResultWrap.rollbackSuccess(xid);        System.out.println("============rollback==============");        return result;    }}

業務層:XNo28資訊網——每日最新資訊28at.com

@Autowired  private AccountInTcc accountInTcc;  @Override  public Boolean deductMoney(String accountNo, Double amount) {      return accountInTcc.prepareDeductMoney(null,accountNo,amount);  }

參數中的BusinessActionContext不需要開發人員自己傳遞,直接給null即可,Seata會自動處理。XNo28資訊網——每日最新資訊28at.com

mapper:XNo28資訊網——每日最新資訊28at.com

@Update("update account_info set account_balance = account_balance - #{amount}, frozen_money = frozen_money + #{amount} where account_no = #{accountNo} and account_balance >= #{amount}")    int prepareDeductMoney(@Param("accountNo") String accountNo, @Param("amount") Double amount);    @Update("update account_info set frozen_money = frozen_money - #{amount} where account_no = #{accountNo}")    int commitDeductMoney(@Param("accountNo") String accountNo, @Param("amount") Double amount);    @Update("update account_info set account_balance = account_balance + #{amount}, frozen_money = frozen_money - #{amount} where account_no = #{accountNo}")    int rollbackDeductMoney(@Param("accountNo") String accountNo, @Param("amount") Double amount);

bank4服務調用:XNo28資訊網——每日最新資訊28at.com

@GlobalTransactional    @Override    public Boolean addMoney(String accountNo, Double amount) {        String result = bank3Client.deduct(amount);        if("true".equalsIgnoreCase(result)){            Boolean flag = baseMapper.addMoney(accountNo,amount) > 0;            if(amount != 30 ) throw new RuntimeException("bank4 make exception amount != 30");            return flag;        }        return false;    }

TCC的優點:XNo28資訊網——每日最新資訊28at.com

  • 一階段完成直接提交事務,釋放數據庫資源,性能好
  • 相比AT模型,無需生成快照,無需使用全局鎖,性能最強
  • 不依賴數據庫事務,而是依賴補償操作,可以用于非事務型數據庫

TCC的缺點:XNo28資訊網——每日最新資訊28at.com

  • 有代碼侵入,需要人為編寫try、Confirm和Cancel接口,太麻煩
  • 軟狀態,事務是最終一致
  • 需要考慮Confirm和Cancel的失敗情況,做好冪等處理
  • 空回滾:當某分支事務的try階段阻塞時,可能導致全局事務超時而觸發二階段的cancel操作。在未執行try操作時先執行了cancel操作,這時cancel不能做回滾,就是空回滾
  • 業務懸掛:對于已經空回滾的業務,之前被阻塞的try操作恢復,繼續執行try,就永遠不可能confirm或cancel ,事務一直處于中間狀態,這就是業務懸掛。

圖片圖片XNo28資訊網——每日最新資訊28at.com

執行cancel操作時,應當判斷try是否已經執行,如果尚未執行,則應該空回滾。XNo28資訊網——每日最新資訊28at.com

執行try操作時,應當判斷cancel是否已經執行過了,如果已經執行,應當阻止空回滾后的try操作,避免懸掛。XNo28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-70394-0.html借助Nacos高效配置與實踐Seata事務的TCC模式

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: PHP 高性能的事件循環庫 Revolt

下一篇: Vue3問題:如何實現頁面引導提示?

標簽:
  • 熱門焦點
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財經作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因為索尼在PS平臺上線《原神》,怒而
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更是首發搭載了聯發科天璣9200+旗艦
  • 聯想YOGA 16s 2022筆記本將要推出,屏幕支持觸控功能

    聯想此前宣布,將于11月2日19:30召開聯想秋季輕薄新品發布會,推出聯想 YOGA 16s 2022 筆記本等新品。官方稱,YOGA 16s 2022 筆記本將搭載 16 英寸屏幕,并且是一
Top 主站蜘蛛池模板: 台山市| 抚顺市| 临沭县| 黑龙江省| 邻水| 东阿县| 彭山县| 大姚县| 临邑县| 普兰县| 溧阳市| 宜阳县| 昭苏县| 开原市| 来安县| 石城县| 兴山县| 阿荣旗| 梁山县| 西林县| 云南省| 鄂温| 堆龙德庆县| 增城市| 商城县| 汝阳县| 大洼县| 额敏县| 汉中市| 政和县| 鲜城| 铜川市| 鞍山市| 新龙县| 凤城市| 会同县| 临西县| 荣昌县| 高雄市| 南丰县| 平度市|