seata框架

Seata简介:(Seata | Seata(官方网站))

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

相关术语:

TC (Transaction Coordinator) - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

seata框架_第1张图片

分类:

AT模式:

该模式下数据库中有undo-log表来记录每次修改操作。若执行完成,未发生异常,则直接清空undo-log表,并提交全局事务。否则通过undo-log表来进行回滚操作。

seata框架_第2张图片

局限性:由于回滚操作依赖于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模式:

seata框架_第3张图片

TCC异常情况:
1:未执行try,直接执行cancel操作。

原因:Try超时导致还未执行发生异常执行cancel操作。

解决:增加事务日志表,若TYR执行完成,在日志表里插入一条记录,可以执行cancel操作,否则执行空回滚操作。

2:幂等(多次执行confirm,cancel操作)

原因: 网络原因,服务宕机

解决:做幂等性操作,在事务日志表中增加一个字段用来记录操作状态(初始化,已提交,已回滚),根据状态执行对应操作。

3:防悬挂(未执行完TRY,执行cancel操作)

原因:TRY执行中超时导致发生异常

解决:执行cancel时添加事务日志记录,后续执行try时就无法插入记录(主键约束)。

你可能感兴趣的:(SpringBoot,微服务)