官方文檔
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);
}
}


