shardingJDBC整合分布式事务SEATA解决一致性问题

q1871901600 发布于 2024-10-21 21 次阅读


1.1 OA项目签章链路中的分布式事务场景

(1)用户pdf文件签章修改文件物理文件的信息

(2)文件内容修改成功后,将文件上传到区块链上

(3)保存文件新版本到本地并且保存到文件表

(4)发送邮件给客户签署成功

1.2 常见分布式事务解决方案

项目中会结合下单的业务重点讲解两种分布式事务解决方案:

集成了shardingJDBC分库之后使用分布式事务seata,只能只用AT模式最方便了,改动最小,对数据库依赖适中。

1,AT 需要引入 sharding‐transaction‐base‐seata‐at 包,创建undo表,再改变 数据源就行

2,XA模式需要额外引入 sharding-transaction-xa-core,使用sharding-transaction的注解,再改变响应配置和数据源,需要数据库支持XA协议

3,TCC模式,除了引入 sharding‐transaction‐base‐seata‐at 包,还有自定义数据源,创建一个代理的TCC接口类, 并调用 TCC 接口实现类 TryConfirmCancel 三个阶段对应的函数。

综合以上特点,这个场景选型为AT模式,因为OA系统需要支持多种不同类型的数据库,不确定客户数据库是否支持XA协议,并且不能在事务上花费太大的开发成本。

在之前集成的JDBC基础上进行以下修改

1,引入seata依赖

<!‐‐分布式事务 seata依赖‐‐>
2 <dependency>
3 <groupId>com.alibaba.cloud</groupId>
4 <artifactId>spring‐cloud‐starter‐alibaba‐seata</artifactId>
5 <version>2.2.8.RELEASE</version>
6 <exclusions>
7 <exclusion>
8 <groupId>io.seata</groupId>
9 <artifactId>seata‐spring‐boot‐starter</artifactId>
10 </exclusion>
11 </exclusions>
12 </dependency>
13
14 <dependency>
15 <groupId>io.seata</groupId>
16 <artifactId>seata‐spring‐boot‐starter</artifactId>
17 <version>1.5.1</version>
18 </dependency>

2)微服务对应数据库中添加undo_log表(仅AT模式)

-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';

3)微服务application.yml中添加seata配置

#seata 配置
seata:
  application-id: zhiyiblog-server
  # seata 服务分组,要与服务端配置service.vgroup_mapping的后缀对应
  tx-service-group: zhiyi-doc-group
  registry:
    # 指定nacos作为注册中心
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.65.103:8848
      group: SEATA_GROUP

  config:
    # 指定nacos作为配置中心
    type: nacos
    nacos:
      server-addr: 192.168.65.103:8848
      namespace: 7e838c12-8554-4231-82d5-6d93573ddf32
      group: SEATA_GROUP
      data-id: seataServer.properties

4) 配置并启动seata-server服务

seata服务配置和启动 | jhon的技术分享

5)配置并启动nacos服务

6)全局事务发起者开启全局事务配置

//全局事务交给SeataATShardingTransactionManager管理
@ShardingTransactionType(TransactionType.BASE)
@Transactional
public FileResult generateSign(FileEntity fileEntity, Long memberId) {
注意:GlobalTransactional和ShardingTransactionType不能同时出现,此处不能使用@GlobalTransactional。同时需要关闭数据源自动代理

seata:
  enable-auto-data-source-proxy: false  #关闭数据源自动代理,交给sharding-jdbc那边

遇到的问题:

1,总是偶尔遇到执行sql时创建表(解决方法:关闭shardingjdbc的自动建表(ignore-not-exists-table: true))

2,分库的sql不打印。(解决方法:配置好shardingJDBC的sql打印配置,把数据库配置的sql打印配置去掉)

参考博客:

1,ShardingSphere之Sharding-JDBC整合XA模式、Saga模式、Seata原理介绍以及代码演示_sharding xa-CSDN博客

2,Apache ShardingSphere整合Seata AT分布式事务 · ShardingSphere - 博客

一个会写python的Java工程师
最后更新于 2024-10-23