当前位置: 首页 > news >正文

springcloudSeata处理分布式事务之1.7.0

1.5.0之后版本发生了很大改变

1.seata安装

1.1官网地址

http://seata.io/zh-cn/

1.2下载地址

https://github.com/seata/seata/releases
下载的是seata-server-1.7.0.zip

1.3seata相关配置的修改

seata-server-1.7.0\seata\conf下的application.yml进行修改

server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:# seata运行日志自定义了path: F:/2023_wyr_study/logsextend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seata##此处为修改内容########### 配置中心为nacos
seata:config:# support: nacos, consul, apollo, zk, etcd3 配置中心type: nacosnacos:server-addr: 127.0.0.1:8848group : "SEATA_GROUP"namespace: ""dataId: "seataServer.properties"username: "nacos"password: "nacos"########### 注册中心为nacosregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype:  nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group : "SEATA_GROUP"namespace: ""username: "nacos"password: "nacos"########### 存储模式为数据库且存到mysql 这里根据你自己的mysql连接版本写 也可以将mysql配置写到nacos中######## 到seata-server-1.7.0\seata\lib\jdbc看是否支持可store:# support: file 、 db 、 redismode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?serverTimeZone=UTC&rewriteBatchedStatements=trueuser: rootpassword: rootmin-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000
#  server:
#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login

1.4 nacos中seata配置文件

参考地址https://githubfast.com/seata/seata/blob/master/script/config-center/config.txt
按照你的1.3有关nacos配置文件书写
创建group : “SEATA_GROUP” dataId: "seataServer.properties"的配置文件
内容如下

#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
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
transport.serialization=seata
transport.compressor=none# 事务组名称可以写成你自己的 default_tx_group比如service.vgroupMapping.my_group=default
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false#Transaction rule configuration, only for the client
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=true
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
client.undo.dataValidation=true
client.undo.logSerialization=jackson
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
#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h#Log rule configuration, for client and server
log.exceptionRate=100#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
#默认为file,一定要改为db,否则自己写的服务不连接不到seata
store.mode=db
store.lock.mode=db
store.session.mode=db#If `store.mode,store.lock.mode,store.session.mode` are not equal to `file`, you can remove the configuration block.
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#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
#mysql的相关配置 其实和1.3的有一处写就可以了
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?serverTimeZone=UTC&rewriteBatchedStatements=true
store.db.user=root#写你自己的
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000#Transaction rule configuration, only for the server
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
server.distributedLockExpireTime=10000
server.xaerNotaRetryTimeout=60000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.enableParallelRequestHandle=false#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

小总结

  1. 事务组名称可以自定义 service.vgroupMapping.default_tx_group=default 比如service.vgroupMapping.my_group=default
  2. 修改store.mode store.lock.mode store.session.mode这三个值为db,才能让seata连接到下面的数据库中。
  3. 数据库的相关配置

1.5事务表的创建

数据库名为seata和上述配置文件中的数据库名称一致
sql语句位置seata-server-1.7.0\seata\script\server\db

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(`xid`                       VARCHAR(128) NOT NULL,`transaction_id`            BIGINT,`status`                    TINYINT      NOT NULL,`application_id`            VARCHAR(32),`transaction_service_group` VARCHAR(32),`transaction_name`          VARCHAR(128),`timeout`                   INT,`begin_time`                BIGINT,`application_data`          VARCHAR(2000),`gmt_create`                DATETIME,`gmt_modified`              DATETIME,PRIMARY KEY (`xid`),KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(`branch_id`         BIGINT       NOT NULL,`xid`               VARCHAR(128) NOT NULL,`transaction_id`    BIGINT,`resource_group_id` VARCHAR(32),`resource_id`       VARCHAR(256),`branch_type`       VARCHAR(8),`status`            TINYINT,`client_id`         VARCHAR(64),`application_data`  VARCHAR(2000),`gmt_create`        DATETIME(6),`gmt_modified`      DATETIME(6),PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(`row_key`        VARCHAR(128) NOT NULL,`xid`            VARCHAR(128),`transaction_id` BIGINT,`branch_id`      BIGINT       NOT NULL,`resource_id`    VARCHAR(256),`table_name`     VARCHAR(32),`pk`             VARCHAR(36),`status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',`gmt_create`     DATETIME,`gmt_modified`   DATETIME,PRIMARY KEY (`row_key`),KEY `idx_status` (`status`),KEY `idx_branch_id` (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE IF NOT EXISTS `distributed_lock`
(`lock_key`       CHAR(20) NOT NULL,`lock_value`     VARCHAR(20) NOT NULL,`expire`         BIGINT,primary key (`lock_key`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

在这里插入图片描述
启动你的nacos再启动你的seata就ok了 seata-server.cmd -h 127.0.0.1 -p 8091 -m db

2.springcloud集成seata

版本查看网址
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

1.引入seata依赖

我这里使用的springboot2.2.2.RELEASE版本和springcloud2.2.2.RELEASE版本

引入的seata依赖参考 http://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html

<!--seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.7.0</version></dependency>

2. 在对应的每个业务库中创建undo_log建表、配置参数(仅AT模式)

具体地址
https://githubfast.com/seata/seata/blob/master/script/client/at/db/mysql.sql

-- 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';
ALTER TABLE `undo_log` ADD INDEX `ix_log_created` (`log_created`);

在这里插入图片描述

3.在你的服务的配置文件中加入seata相关配置

# 事务组名称和1.4service.vgroupMapping.default_tx_group=default相对应
seata:service:vgroupMapping:default_tx_group: defaultdisable-global-transaction: falsegrouplist:default: 127.0.0.1:8091

4.项目中简单应用 @GlobalTransactional

/*** 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态* 简单说:* 下订单->减库存->减余额->改状态*/@Override@GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)public void create(Order order) {log.info("------->下单开始");//本应用创建订单orderMapper.create(order);//远程调用库存服务扣减库存log.info("------->order-service中扣减库存开始");storageService.decrease(order.getProductId(),order.getCount());log.info("------->order-service中扣减库存结束");//远程调用账户服务扣减余额log.info("------->order-service中扣减余额开始");accountService.decrease(order.getUserId(),order.getMoney());log.info("------->order-service中扣减余额结束");//修改订单状态为已完成log.info("------->order-service中修改订单状态开始");orderMapper.update(order.getUserId(),1);log.info("------->order-service中修改订单状态结束");log.info("------->下单结束");}
http://www.lryc.cn/news/158903.html

相关文章:

  • 每日刷题|回溯法解决全排列问题
  • 10-JVM调优工具详解
  • 东方博易oj——3119 - 约瑟夫问题2(链表)
  • C++,day0907
  • 孤儿僵尸守护进程的简单理解
  • 学习笔记——Java入门第一季
  • 更改注册表exe值后的惨痛经历
  • stable diffusion实践操作-LyCORIS
  • 无需公网IP教你如何外网远程访问管家婆ERP进销存
  • Swift使用编解码库Codable
  • Vue + Element UI 前端篇(三):工具模块封装
  • 【pytorch】数据加载dataset和dataloader的使用
  • 搭建单机版FastDFS分布式文件存储系统
  • 【验证码逆向专栏】房某下登录滑块逆向分析
  • Python 3.11 版本是对线程安全做了什么更改吗
  • 【Docker】镜像的创建、管理与发布
  • 移动硬盘或U盘无法弹出的解决方法
  • (leetcode1761一个图中连通三元组的最小度数,暴力+剪枝)-------------------Java实现
  • 【漏洞复现】金和OA C6任意文件读取漏洞
  • 2023年全国大学生数学建模B题
  • 【LeetCode】2651.计算列车到站时间
  • Redis——认识Redis
  • 通讯录怎么导入新手机?3个推荐小妙招
  • Geoserver发布shp、tiff、瓦片等格式的GIS数据
  • 读书笔记-《ON JAVA 中文版》-摘要24[第二十一章 数组]
  • go语言基本操作---五
  • 【sgLazyTree】自定义组件:动态懒加载el-tree树节点数据,实现增删改、懒加载及局部数据刷新。
  • Rust个人学习笔记
  • Java根据身份证号码提取出省市区,JSON数据格式
  • MySQL知识笔记——初级基础(实施工程师和DBA工作笔记)