Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

seata

官网

安装

JDK

安装

seata

解压即可

其他

领域模型

  • TC (Transaction Coordinator) - 事务协调者: 维护全局和分支事务的状态,驱动全局事务提交或回滚。
  • TM (Transaction Manager) - 事务管理器: 定义全局事务的范围:开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - 资源管理器: 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

事务模式

AT模式和XA模式基于数据库代理,暂时未知如何在同一个项目使用多个代理(已尝试dynamic-datasource框架,在处理提交及回滚时出现问题)。

AT

at

需要在对应数据库下创建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

TCC

try-confirm-cancel(TCC)

tcc

需要@LocalTCC@TwoPhaseBusinessAction注解标记

  1. @LocalTCC标注调用的操作类,该类实现preparecommitrollback方法。
  2. @TwoPhaseBusinessAction注解标记prepare方法,并用@BusinessActionContextParameter标记业务参数。
  3. prepare方法表示try阶段,该阶段执行业务检查并锁定资源。
  4. commit方法表示confirm阶段,该阶段提交事务(尽量不失败, 可能重试)。
  5. rollback方法表示cancel阶段,该阶段回滚事务(尽量不失败, 可能重试)。

支持数据库: 不依赖数据库

Saga

支持数据库: 不依赖数据库

XA

ServerXaImpl.java

启动类需要添加@EnableAutoDataSourceProxy(dataSourceProxyMode = "XA")注解

支持数据库:

  • MySQL
  • Oracle
  • PostgreSQL
  • MariaDB

比较

AT TCC Saga XA
一致性 弱一致 弱一致 最终一致 强一致
隔离性 全局锁 资源预留 完全隔离
代码侵入性 需手动实现三个方法 要编写状态机及补偿代码
性能 很高 很高

微服务适配

Dubbo

Spring

  • 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