Seata简介:(Seata | Seata(官方网站))
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
相关术语:
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
分类:
AT模式:
该模式下数据库中有undo-log表来记录每次修改操作。若执行完成,未发生异常,则直接清空undo-log表,并提交全局事务。否则通过undo-log表来进行回滚操作。
局限性:由于回滚操作依赖于undo-log表,所以只能在mysql数据库中使用,其他数据库就只能采用TCC模式。
undo-log.sql文件(官网摘取)
-- 注意此处0.7.0+ 增加字段 context
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`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模式:
TCC异常情况:
1:未执行try,直接执行cancel操作。
原因:Try超时导致还未执行发生异常执行cancel操作。
解决:增加事务日志表,若TYR执行完成,在日志表里插入一条记录,可以执行cancel操作,否则执行空回滚操作。
2:幂等(多次执行confirm,cancel操作)
原因: 网络原因,服务宕机
解决:做幂等性操作,在事务日志表中增加一个字段用来记录操作状态(初始化,已提交,已回滚),根据状态执行对应操作。
3:防悬挂(未执行完TRY,执行cancel操作)
原因:TRY执行中超时导致发生异常
解决:执行cancel时添加事务日志记录,后续执行try时就无法插入记录(主键约束)。