AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

實現(xiàn)

TCC 模式

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

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

流程分析

圖片圖片Vl028資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片Vl028資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Vl028資訊網(wǎng)——每日最新資訊28at.com

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

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

圖片圖片Vl028資訊網(wǎng)——每日最新資訊28at.com

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

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

圖片圖片Vl028資訊網(wǎng)——每日最新資訊28at.com

需要回滾,那么就要釋放凍結(jié)金額,恢復可用金額Vl028資訊網(wǎng)——每日最新資訊28at.com

Seata的TCC模型

圖片圖片Vl028資訊網(wǎng)——每日最新資訊28at.com

代碼樣例

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

bank3:Vl028資訊網(wǎng)——每日最新資訊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);}

具體實現(xiàn):Vl028資訊網(wǎng)——每日最新資訊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;        }        // 避免空懸掛,已經(jīng)執(zhí)行過回滾了就不能再預留資源        if (TccActionResultWrap.hasRollbackResult(xid) || TccActionResultWrap.hasCommitResult(xid)) {            return false;        }        // 預留資源        boolean result = accountInfoMapper.prepareDeductMoney(accountNo,amount) > 0;        // 記錄執(zhí)行結(jié)果,以便回滾時判斷是否是空回滾        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");        // 執(zhí)行提交操作,扣除預留款        boolean result = accountInfoMapper.commitDeductMoney(accountNo,amount.doubleValue()) > 0;        // 清除預留結(jié)果        TccActionResultWrap.removePrepareResult(xid);        // 設置提交結(jié)果        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;        }        // 沒有預留資源結(jié)果,回滾不做任何處理;        if (!TccActionResultWrap.hasPrepareResult(xid)) {            // 設置回滾結(jié)果,防止空回滾            TccActionResultWrap.rollbackSuccess(xid);            return true;        }        // 執(zhí)行回滾        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;        // 清除預留結(jié)果        TccActionResultWrap.removePrepareResult(xid);        // 設置回滾結(jié)果        TccActionResultWrap.rollbackSuccess(xid);        System.out.println("============rollback==============");        return result;    }}

業(yè)務層:Vl028資訊網(wǎng)——每日最新資訊28at.com

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

參數(shù)中的BusinessActionContext不需要開發(fā)人員自己傳遞,直接給null即可,Seata會自動處理。Vl028資訊網(wǎng)——每日最新資訊28at.com

mapper:Vl028資訊網(wǎng)——每日最新資訊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服務調(diào)用:Vl028資訊網(wǎng)——每日最新資訊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的優(yōu)點:Vl028資訊網(wǎng)——每日最新資訊28at.com

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

TCC的缺點:Vl028資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片Vl028資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行cancel操作時,應當判斷try是否已經(jīng)執(zhí)行,如果尚未執(zhí)行,則應該空回滾。Vl028資訊網(wǎng)——每日最新資訊28at.com

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

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

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

上一篇: PHP 高性能的事件循環(huán)庫 Revolt

下一篇: Vue3問題:如何實現(xiàn)頁面引導提示?

標簽:
  • 熱門焦點
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發(fā)布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發(fā)布,本次就這款耳機新品給大家?guī)硪粋€簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產(chǎn)
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內(nèi)市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發(fā)布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動,剛剛開始的蘋果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 小紅書1周漲粉49W+,我總結(jié)了小白可以用的N條漲粉筆記

    作者:黃河懂運營一條性教育視頻,被54萬人&ldquo;珍藏&rdquo;是什么體驗?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點贊!更瘋狂的是,這
  • 騰訊VS網(wǎng)易,最卷游戲暑期檔,誰能笑到最后?

    作者:無銹缽來源:財經(jīng)無忌7月16日晚,上海1862時尚藝術中心。伴隨著幻象的精準命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰(zhàn)隊以絕對的優(yōu)勢戰(zhàn)勝了BLG戰(zhàn)隊,拿下了總決
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更是首發(fā)搭載了聯(lián)發(fā)科天璣9200+旗艦
  • iQOO Neo8系列新品發(fā)布會

    旗艦雙芯 更強更Pro
  • Meta盲目擴張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創(chuàng)意日前,Meta創(chuàng)始人兼CEO 馬克&middot;扎克伯發(fā)布公開信,宣布Meta計劃裁員超11000人,占其員工總數(shù)13%。他公開承認了自己的預判失誤:&ldquo;不僅
Top