解压即可
- 启动
bin/seata-server.sh
- 管理平台 http://192.168.31.201:7091/
- 默认用户名密码:
seata
seata
- TC (Transaction Coordinator) - 事务协调者: 维护全局和分支事务的状态,驱动全局事务提交或回滚。
- TM (Transaction Manager) - 事务管理器: 定义全局事务的范围:开始全局事务、提交或回滚全局事务。
- RM (Resource Manager) - 资源管理器: 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
AT模式和XA模式基于数据库代理,暂时未知如何在同一个项目使用多个代理(已尝试dynamic-datasource框架,在处理提交及回滚时出现问题)。
需要在对应数据库下创建undo_log
表
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
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,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
支持数据库:
- MySQL
- Oracle
- PostgreSQL
- TiDB
- MariaDB
try-confirm-cancel(TCC)
需要@LocalTCC
和@TwoPhaseBusinessAction
注解标记
@LocalTCC
标注调用的操作类,该类实现prepare
、commit
、rollback
方法。@TwoPhaseBusinessAction
注解标记prepare
方法,并用@BusinessActionContextParameter
标记业务参数。prepare
方法表示try
阶段,该阶段执行业务检查并锁定资源。commit
方法表示confirm
阶段,该阶段提交事务(尽量不失败, 可能重试)。rollback
方法表示cancel
阶段,该阶段回滚事务(尽量不失败, 可能重试)。
支持数据库: 不依赖数据库
支持数据库: 不依赖数据库
启动类需要添加@EnableAutoDataSourceProxy(dataSourceProxyMode = "XA")
注解
支持数据库:
- MySQL
- Oracle
- PostgreSQL
- MariaDB
AT | TCC | Saga | XA | |
---|---|---|---|---|
一致性 | 弱一致 | 弱一致 | 最终一致 | 强一致 |
隔离性 | 全局锁 | 资源预留 | 无 | 完全隔离 |
代码侵入性 | 无 | 需手动实现三个方法 | 要编写状态机及补偿代码 | 无 |
性能 | 高 | 很高 | 很高 | 低 |
- provider
- consumer
- RestTemplate
@Bean public RestTemplate restTemplate(LoadBalancerInterceptor loadBalancer, SeataRestTemplateInterceptor seata) { return new RestTemplateBuilder() .interceptors(loadBalancer, seata) .build(); }
- RestClient
@Bean public RestClient restClient(LoadBalancerInterceptor loadBalancer, SeataRestTemplateInterceptor seata) { return RestClient.builder() .requestInterceptors(interceptors -> { interceptors.add(loadBalancer); interceptors.add(seata); }) .build(); }
- WebClient
@Bean public WebClient webClient(ReactorLoadBalancerExchangeFilterFunction filter) { return WebClient.builder() .filter(filter) .filter((request, next) -> { String xid = RootContext.getXID(); if (StringUtils.hasLength(xid)) { request = ClientRequest.from(request) .headers(httpHeaders -> httpHeaders.add(RootContext.KEY_XID, xid)) .build(); } return next.exchange(request); }) .build(); }
- Feign
- HttpExchange
- RestTemplate