Skip to content

Latest commit

 

History

History

seata

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

README.md

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标注调用的操作类,该类实现prepare、commit、rollback方法。
  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