分布式事务seata使用

1、问题背景

微服务架构中,随着业务的拆分,数据库必然跟着业务拆分,分库,分表;跨库跨服务必然会引发事务问题;导致不同服务的数据一致性问题

2、seata介绍

seata 是开源的分布式事务解决方案,致力于微服务架构下提高性能和简单易用的分布式事务服务;

seata 服务主要由3部分组成

下面斜体的是我自己对官方的话的一个解释

TC - 事务协调者

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

事务协调者,可以理解为seata-server, 也就是seata的服务端

TM - 事务管理器

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

事务管理器,就是 事务发起方,比如下面的示例事务管理者就是business, 一般加@GlobalTransactional 注解

RM - 资源管理器

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

事务的参与者,如下示例的Storage, Order, Account, 这些服务不需要加注解,但是项目需要做一些配置,下面会进一步讲解

对于上面多的概念,可能很难理解,下面用官方的示例说明一下

  • 秒杀服务(Business): 发起也对个服务的调用
  • 仓储服务(Storasge):对给定的商品扣除仓储数量。
  • 订单服务(Order):根据采购需求创建订单。
  • 帐户服务(Account):从用户帐户中扣除余额。

3 、 整体机制

seata做了什么, 下面是AT模式的说明

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

4、seata接入方式

使用的是AT模式

4.1, 4.2, 是所有参与事务的服务都需要引用的

4.1 引包

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>

4.2 改yml

# 数据库的配置示例
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time: GMT+8
  application:
    name: demo-geek-order
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://xxx:3306/xxx?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
      username: xxx
      password: xxx
      max-active: 20
      min-idle: 2
    driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: xxx:8848
        namespace: 82632dc2-fce3-4288-b49e-9d270643df74

# seat 配置
seata:
  enabled: true
  tx-service-group: my_test_tx_group
  enable-auto-data-source-proxy: true
  application-id: ${spring.application.name}
  config:
    type: nacos
    nacos:
      group: SEATA_GROUP
      server-addr: xxx.5:8848
      namespace: 82632dc2-fce3-4288-b49e-9d270643df74
  registry:
    type: nacos
    nacos:
      cluster: default
      server-addr: xxx.5:8848
      namespace: 82632dc2-fce3-4288-b49e-9d270643df74

4.3 配置事务管理器- 事务发起方

添加注解: @GlobalTransactional(timeoutMills = 50000, name = "prex-create-order")

  • timeoutMills : 超时时间
  • name: 事务组
@GlobalTransactional(timeoutMills = 50000, name = "prex-create-order")
public void createOrder(OrderReq order) throws Exception {

}

参考

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT界的奇葩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值