LCN筆記

官方文檔

LCN概念

lock 鎖定事務(wù)單元
confirm 確認事務(wù)單元
notify 通知事務(wù)單元

三種模式

LCN模式
TXC模式
TCC模式

組成

image.png

事務(wù)原理

image.png

需要注意

image.png

一階段與二階段需要使用同意連接才能保證事務(wù),所以一階段完成后,連接'假釋放',使用特定標識
存儲到容器中,供二階段提交時獲取和使用

補償機制

二階段通知失敗,信息(標識、記錄、通知的具體sql)保存在tx-manager的redis中,供后續(xù)重試
tx_logger

TCC模式

  • 原理介紹:
    TCC事務(wù)機制相對于傳統(tǒng)事務(wù)機制(X/Open XA Two-Phase-Commit),其特征在于它不依賴資源管理器(RM)對XA的支持,而是通過對(由業(yè)務(wù)系統(tǒng)提供的)業(yè)務(wù)邏輯的調(diào)度來實現(xiàn)分布式事務(wù)。主要由三步操作,Try: 嘗試執(zhí)行業(yè)務(wù)、 Confirm:確認執(zhí)行業(yè)務(wù)、 Cancel: 取消執(zhí)行業(yè)務(wù)
  • 模式特點:
    該模式對代碼的嵌入性高,要求每個業(yè)務(wù)需要寫三種步驟的操作。
    該模式對有無本地事務(wù)控制都可以支持使用面廣。
    數(shù)據(jù)一致性控制幾乎完全由開發(fā)者控制,對業(yè)務(wù)開發(fā)難度要求高。
@Service
@Slf4j
public class DemoServiceImpl implements DemoService {

    private final EDemoMapper demoMapper;

    private ConcurrentHashMap<String, Long> ids = new ConcurrentHashMap<>();

    @Autowired
    public DemoServiceImpl(EDemoMapper demoMapper) {
        this.demoMapper = demoMapper;
    }

    @Override
    @TccTransaction(propagation = DTXPropagation.SUPPORTS)
    @Transactional
    public String rpc(String value) {
        /*
         * 注意 5.0.0 請用 DTXLocal 類
         * 注意 5.0.0 請自行獲取應(yīng)用名稱
         * 注意 5.0.0 其它類重新導(dǎo)入包名
         */
//        log.info("GroupId: {}", TracingContext.tracing().groupId());

        Demo demo = new Demo();
        demo.setDemoField(value);
        demo.setCreateTime(new Date());
        demo.setAppName(Transactions.APPLICATION_ID_WHEN_RUNNING);
        demo.setGroupId(DTXLocalContext.getOrNew().getGroupId());
        demo.setUnitId(DTXLocalContext.getOrNew().getUnitId());
        demoMapper.save(demo);
//        ids.put(DTXLocalContext.getOrNew().getGroupId(), demo.getId());
        return "ok-e";
    }

    public void confirmRpc(String value) {
        log.info("tcc-confirm-" + DTXLocalContext.getOrNew().getGroupId());
        ids.remove(DTXLocalContext.getOrNew().getGroupId());
    }

    public void cancelRpc(String value) {
        log.info("tcc-cancel-" + DTXLocalContext.getOrNew().getGroupId());
        Long kid = ids.get(DTXLocalContext.getOrNew().getGroupId());
        demoMapper.deleteByKId(kid);
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 2PC 兩階段提交協(xié)議。它引入了一個事務(wù)協(xié)調(diào)者角色,來管理各個參與者請求提交階段協(xié)調(diào)器向所有參與者發(fā)送事務(wù)請求...
    格林哈閱讀 320評論 0 0
  • 1.常規(guī)事務(wù) 1.1事務(wù)特性(剛性事務(wù)) A(Atomicity):原子性 C(Consistency):一致性 ...
    指尖架構(gòu)141319閱讀 194評論 0 0
  • 一、Seata介紹 全局的跨數(shù)據(jù)庫的多數(shù)據(jù)源的統(tǒng)一調(diào)度。微服務(wù)環(huán)境下,原來的多個模塊被拆分為多個獨立的應(yīng)用,分別使...
    CJ21閱讀 2,184評論 0 3
  • 內(nèi)存模型以及分區(qū) JVM分為虛擬機棧、堆、方法區(qū)、本地方法區(qū)堆,用來存放實例化對象、非static成員變量,屬于線...
    北京黃小胖閱讀 1,469評論 0 0
  • 分布式事務(wù)筆記 1.最終一致性方案[異步最終一致] 1.1流程圖 1.2 業(yè)務(wù)流程步驟 業(yè)務(wù)系統(tǒng)A發(fā)送消息到消息系...
    lemonMT閱讀 1,229評論 0 0

友情鏈接更多精彩內(nèi)容