SEATA分布式事务实战应用


       在项目开发中,需要进行分布式事务控制,选用了阿里开源分布式事务处理方案(SEATA)。在使用SEATA中遇到了很多的问题,这里一下,方便大家学习指正。

 1. seata安装
         windows环境安装,下载seata安装包。安装包下载完成后,直接解压即可!

     linux环境下安装好seata后,所有的配置与windows环境相同。

 2. 版本选择
         在项目使用中,我选择了两个SEATA版本,1.6.1与1.5.2两个版本都进行了部署使用,两个大版本存在一定的差异。

区别:

  •  1.6.1版本使用时会进行主键自增字段的校验,使用mybatis或者mybatis-plus时,需要自己在代码中进行自增主键的设置,不能使用数据库中字段的自增(mysql)或者是序列(pgsql)。

        1.5.2版本使用时不会进行主键自增字段校验。

  • 1.6.1版本支持JDK17及SpringBoot3.0.
  • 1.6.1版本后支持多注册中心服务暴漏。

 3. SEATA目标打造一站式的分布事务的解决方案,最终会提供四种事务模式:AT、TCC、SAGA、XA。有兴趣可以深入研究一下四种模式的实现原理。

4、使用注意问题

  • 我是使用的AT模式,注册中心采用的NACOS。seata配置文件配置如下图:
  • nacos配置文件如下:

transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=false
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
# 自定义 vgroupMapping 名称
service.vgroupMapping.common-group=default
service.vgroupMapping.ccfw-supervise-sys-group=default
service.vgroupMapping.ccfw-operator-sys-group=default

# grouplist 只适用文件模式
# service.default.grouplist=127.0.0.1:8091
# service.enableDegrade=false
# service.disableGlobalTransaction=false
# client.rm.asyncCommitBufferLimit=10000
# client.rm.lock.retryInterval=10
# client.rm.lock.retryTimes=30

# Seata 提供了一个“全局锁重试”功能,默认未开启(遇到全局锁冲突时是否回滚,默认为 true)
client.rm.lock.retryPolicyBranchRollbackOnConflict=false
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=false
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
# 更改db模式
store.mode=db
# store.publicKey=
# store.file.dir=file_store/data
# store.file.maxBranchSessionSize=16384
# store.file.maxGlobalSessionSize=512
# store.file.fileWriteBufferCacheSize=16384
# store.file.flushDiskMode=async
# store.file.sessionReloadReadSize=100
store.db.datasource=druid
store.db.dbType=postgresql
store.db.driverClassName=org.postgresql.Driver
store.db.url=jdbc:postgresql://173.18.160.70:5432/seata?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
store.db.user=root
store.db.password=Hetong_2022@SC020
store.db.minConn=5
store.db.maxConn=20
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# store.redis.mode=single
# store.redis.single.host=127.0.0.1
# store.redis.single.port=6379
# store.redis.sentinel.masterName=
# store.redis.sentinel.sentinelHosts=
# store.redis.maxConn=10
# store.redis.minConn=1
# store.redis.maxTotal=100
# store.redis.database=0
# store.redis.password=
# store.redis.queryLimit=100
default.grouplist=173.18.160.161:8091
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
client.undo.dataValidation=true
client.undo.logSerialization=Kryo
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=true
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
  • nacos中添加事务默认分组
  •  pom中引入seata依赖:
  •  代码调用方式

 事务发起调用方式

 子事务方事务调用。

5、分布式事务控制是的单向事务控制,事务发起方报错,子事务回滚。如果需要子事务报错后,事务发起方事务回滚,需要自己进行判断处理。

猜你喜欢

转载自blog.csdn.net/weixin_38863607/article/details/130080382
今日推荐