Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
维护全局和分支事务的状态,驱动全局事务提交或回滚。
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

该模式下数据库中有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;

原因:Try超时导致还未执行发生异常执行cancel操作。
解决:增加事务日志表,若TYR执行完成,在日志表里插入一条记录,可以执行cancel操作,否则执行空回滚操作。
原因: 网络原因,服务宕机
解决:做幂等性操作,在事务日志表中增加一个字段用来记录操作状态(初始化,已提交,已回滚),根据状态执行对应操作。
原因:TRY执行中超时导致发生异常
解决:执行cancel时添加事务日志记录,后续执行try时就无法插入记录(主键约束)。