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 接口实现类 Try
,Confirm
,Cancel
三个阶段对应的函数。
综合以上特点,这个场景选型为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服务
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 - 博客
Comments NOTHING