官方文档
LCN概念
lock 锁定事务单元
confirm 确认事务单元
notify 通知事务单元
三种模式
LCN模式
TXC模式
TCC模式
组成
事务原理
需要注意
一阶段与二阶段需要使用同意连接才能保证事务,所以一阶段完成后,连接'假释放',使用特定标识
存储到容器中,供二阶段提交时获取和使用
补偿机制
二阶段通知失败,信息(标识、记录、通知的具体sql)保存在tx-manager的redis中,供后续重试
tx_logger
TCC模式
- 原理介绍:
TCC事务机制相对于传统事务机制(X/Open XA Two-Phase-Commit),其特征在于它不依赖资源管理器(RM)对XA的支持,而是通过对(由业务系统提供的)业务逻辑的调度来实现分布式事务。主要由三步操作,Try: 尝试执行业务、 Confirm:确认执行业务、 Cancel: 取消执行业务- 模式特点:
该模式对代码的嵌入性高,要求每个业务需要写三种步骤的操作。
该模式对有无本地事务控制都可以支持使用面广。
数据一致性控制几乎完全由开发者控制,对业务开发难度要求高。
@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 请自行获取应用名称
* 注意 5.0.0 其它类重新导入包名
*/
// 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);
}
}