seata
key
TC、TM、RM
- TC (Transaction Coordinator) - 事务协调者
- TM (Transaction Manager) - 事务管理器(全局)
- RM (Resource Manager) - 资源管理器(分支事务)
AT
可能存在的问题
- 本地锁和全局锁容易形成死锁/长事务 => 解决的方法是全局锁超时
- 本地锁是共享的,应该不适合分布式数据库,要求数据库单一节点(
基于本地事务实现的),不够HA - 通过
select for update对事务加读锁,防止读脏数据 - 为什么删除回滚日志(commit的日志)
- 全局锁的管理是个问题
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, // PK
`branch_id` bigint(20) NOT NULL, // union-UK
`xid` varchar(100) NOT NULL, // union-UK
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
TCC
- prepare(资源预留|冻结)
- commit || rollback
可能存在的问题
- rollback|冻结 时效性问题
- 通过
本地事务融于全局事务,怎么实现commit| rollback 成功? 实现比较简单,适合结合本地事务
SAGA
长事务解决方案
可能存在的问题
- 事务链,commit链 -> rollbackl链; 链的第一个节点锁的时间估计会特别长
- 暂时没看到怎么解决长事务、全局事务管理方案
- JOSN 状态机
- 空补偿、悬挂、幂等、=>解决分布式事务带来更多的分布式问题,不是好解决方案(
边际成本增加)
XA
可能存在的问题
- XA协议管理分支事务