springcloud-seata分布式事务

seata安装配置

下载

下载中心 | Seata

image-20231210180818159

image-20231210180747873

上传到linux

image-20231210180957167

解压seata压缩包

tar -zxvf seata-server-1.6.1.tar.gz

image-20231210181100220

nacos配置

创建seata的命名空间

id: seata-id

image-20231210182019152

image-20231210182116522

配置seata

备份application.yml

进入/usr/local/software/springcloud/seata/conf文件夹

备份application.yml

mv application.yml application.yml.bak

image-20231210181542597

修改application.example.yml为application.yml

mv application.example.yml application.yml

image-20231210181718205

修改application.yml

添加seata.security模块
seata:#新添加内容,不加会报错security:secretKey: "securityKey"tokenValidityInMilliseconds: 1000000000

image-20231210182328278

配置seata.config模块
 37   config: 38     # support: nacos 、 consul 、 apollo 、 zk  、 etcd339     type: nacos40     nacos:41       server-addr: 192.168.198.128:777742       namespace: seata-id43       group: SEATA_GROUP44       username:45       password:46       context-path:47       ##if use MSE Nacos with auth, mutex with username/password attribute48       #access-key:49       #secret-key:50       data-id: seataServer.properties

image-20231210182850125

配置seata.registry模块
 72   registry:73     # support: nacos 、 eureka 、 redis 、 zk  、 consul 、 etcd3 、 sofa74     type: nacos75     # preferred-networks: 30.240.*76     nacos:77       application: seata-server78       server-addr: 192.168.198.128:777779       group: SEATA_GROUP80       namespace: seata-id81       cluster: default82       username:83       password:84       context-path:85       ##if use MSE Nacos with auth, mutex with username/password attribute86       #access-key:87       #secret-key:

image-20231210182949776

配置seata.store模块

使用redis存储

    redis:mode: singledatabase: 1min-conn: 10max-conn: 100password:max-total: 100query-limit: 1000single:host: 192.168.198.128port: 6379sentinel:master-name:sentinel-hosts:
image-20231210212601729
添加console模块

新版本中如果不添加此项会报错。

 32 console:33   user:34     username: seata35     password: 123
image-20231210184034551

修改批处理文件

进入/usr/local/software/springcloud/seata/script/config-center/nacos, 修改nacos-config.sh文件

image-20231210184423344
 53 if [ -z ${tenant} ]; then54     tenant="seata-id"55 fi
image-20231210184606616

启动脚本:

sh nacos-config.sh -h nacos服务器地址

 sh nacos-config.sh -h 192.168.198.128
image-20231210185123696

image-20231210185231369

启动seata服务

进入/usr/local/software/springcloud/seata/bin文件夹

-rwxr-xr-x. 1 502 games 3779 1216 2022 seata-server.bat
-rwxr-xr-x. 1 502 games 5795 1216 2022 seata-server.sh
-rwxr-xr-x. 1 502 games    0 628 2022 startup.sh
[root@localhost bin]# pwd
/usr/local/software/springcloud/seata/bin
image-20231210184818711

./seata-server.sh

[root@localhost bin]# ./seata-server.sh
apm-skywalking not enabled
seata-server is starting, you can check the /usr/local/software/springcloud/seata/logs/start.out
[root@localhost bin]#

image-20231210185428779

image-20231210185500289

springcloud整合seata

数据库设计

image-20231210231451838 image-20231210231509083

创建undo表,放入要执行分布式事务的数据库

CREATE TABLE `undo_log` (`branch_id` bigint(20) 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 DEFAULT CHARSET=utf8mb4 COMMENT='AT transaction mode undo table';

引入依赖

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

bootstrap.yml配置文件

image-20231210231817158

seata:enabled: truetx-service-group: default_tx_groupservice:vgroup-mapping:default_tx_group: defaultgrouplist:default: 192.168.198.128:8091
#已经在nacos中配置了,不需要再次配置
#  config:
#    nacos:
#      server-addr: ${spring.cloud.nacos.config.server-addr}
#      namespace: seat-id
#      group: SEATA_GROUP
#  registry:
#    nacos:
#      application: seata-service
#      server-addr: ${spring.cloud.nacos.config.server-addr}
#      namespace: seat-id
#      group: SEATA_GROUP

image-20231210232118677

image-20231210232304602

订单模块

订单模块添加分布式事务

启动订单模块

主从TM
2023-12-10 23:24:28.728  INFO 13176 --- [           main] i.s.core.rpc.netty.NettyPoolableFactory  : NettyPool create channel to transactionRole:TMROLE,address:192.168.198.128:8091,msg:< RegisterTMRequest{applicationId='ssc-cloud-order', transactionServiceGroup='default_tx_group'} >

image-20231210232611395

image-20231210232726507
初始化资源管理(RM)
image-20231210232927633 image-20231210232959179 image-20231210233114826

发起事务请求

使用@GlobalTransactional

package com.wnhz.ssc.cloud.order.service.impl;import cn.hutool.core.lang.Snowflake;
import com.wnhz.ssc.cloud.order.IOrderDao;
import com.wnhz.ssc.cloud.order.service.IOrderService;
import com.wnhz.ssc.cloud.store.feign.IStoreFeign;
import com.wnhz.ssc.domain.entity.po.Order;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.Date;@Slf4j
@Service
public class OrderServiceImpl implements IOrderService {@Autowiredprivate IOrderDao orderDao;@Autowiredprivate IStoreFeign storeFeign;@GlobalTransactional@Overridepublic Long createOrder(long productId, int num) {Order order = new Order();order.setProduct(productId);order.setQuantity(num);order.setCreateBy("test");order.setCreateTime(new Date());order.setUpdateTime(new Date());log.debug("创建order对象成功:{},准备存入数据库....", order);orderDao.insert(order);log.debug("订单对象存入数据库成功,准备扣库存....");storeFeign.decreaseStore(productId, num);log.debug("库存更成功,商品号:{},扣库存:{}个", productId,num);long orderId = new Snowflake().nextId();order.setOrderNum(orderId);orderDao.updateById(order);log.debug("订单号更新完成:{}", orderId);return orderId;}
}
Begin new global transaction [172.18.1.1:8091:8269074957769797653]
:
:
rm handle branch rollback process:xid=172.18.1.1:8091:8269074957769797653,branchId=8269074957769797654,branchType=AT,resourceId=jdbc:mysql://192.168.198.128:3306/ssc_db,applicationData={"skipCheckLock":true}
Branch Rollbacking: 172.18.1.1:8091:8269074957769797653 8269074957769797654 jdbc:mysql://192.168.198.128:3306/ssc_db
Branch Rollbacked result: PhaseTwo_Rollbacked
Suspending current transaction, xid = 172.18.1.1:8091:8269074957769797653
[172.18.1.1:8091:8269074957769797653] rollback status: Rollbacked
[172.18.1.1:8091:8269074957769797653] rollback status: Finished

自定义异常捕获

由于分布式调用返回的异常可能为OpenFeign的异常,分布式事务异常捕获失败。

定义切面捕获分布式 事务异常

package com.wnhz.ssc.cloud.order.aop;import io.seata.core.context.RootContext;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;@Aspect
@Component
@Slf4j
public class SeataExceptionAop {@Pointcut("@annotation(io.seata.spring.annotation.GlobalTransactional)")public void transactionPointCut(){}@AfterThrowing(throwing = "e",pointcut = "transactionPointCut()")public void  globalTransactionalExceiton(Throwable e) throws TransactionException {log.debug("分布式事务异常:{}", e.getMessage());String xid = RootContext.getXID();if(StringUtils.hasText(xid)){log.debug("XID:{}执行回滚操作", xid);GlobalTransactionContext.reload(xid).rollback();log.debug("事务:{}回滚完成", xid);throw new TransactionException("事务处理失败,回滚完成........");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484620.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三十年一个大轮回!日股突破“泡沫时期”历史高点

2月22日周四&#xff0c;英伟达四季报业绩超预期&#xff0c;而且本季度业绩指引非常乐观&#xff0c;提振美股股指期货并成为芯片股和AI概念股情绪的重要催化剂。今日亚洲芯片股和AI股起飞&#xff0c;日本在芯片股的带动下突破1989年泡沫时期以来的历史最高收盘价。 美股方面…

@ControllerAdvice 统一管理异常/错误

ControllerAdvice 统一管理异常/错误 文章目录 ControllerAdvice 统一管理异常/错误一、注意事项二、统一管理异常/错误的好处三、代码实现1. 普通方法2. 统一管理ControllerAdvice3. PostMan测试结果 一、注意事项 1. 如果校验注解不指定 message 属性 ,会返回默认消息, 这些…

【复现】某尔顿 安全审计系统任意文件读取漏洞_56

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 某尔顿网络安全审计产品支持1-3线路的internet接入、1-3对网桥&#xff1b;含强大的上网行为管理、审计、监控模块&#xff1b;用…

[python pip] A new release of pip is available: 23.2.1 -> 24.0

翻译之后&#xff1a;〔通知〕新版本的pip可用&#xff1a;23.2.1->24.0 就是说&#xff0c;你的pip版本需要从当前的 23.2.1 升级到最新版本 24.0&#xff0c;执行如下命令&#xff1a; cmd命令以管理员身份进入目录 ${Python}\Python3.12.1\Scripts下&#xff0c;执行 p…

WEB-UI自动化测试实践

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Android横竖屏切换configChanges=“screenSize|orientation“避免activity销毁重建,Kotlin

Android横竖屏切换configChanges"screenSize|orientation"避免activity销毁重建&#xff0c;Kotlin 如果不在Androidmanifest.xml设置activity的&#xff1a; android:configChanges"screenSize|orientation" 那么&#xff0c;每次横竖屏切换activity都会…

大蟒蛇(Python)笔记(总结,摘要,概括)——第5章 if 语句

目录 5.1 一个简单的示例 5.2 条件测试 5.2.1 检查是否相等 5.2.2 如何在检查是否相等时忽略大小写 5.2.3 检查是否不等 5.2.4 数值比较 5.2.5 检查多个条件 5.2.6 检查特定的值是否在列表中 5.2.7 检查特定的值是否不在列表中 5.2.8 布尔表达式 5.3 if 语句 5.3.1 简单的if…

idea 打不开项目 白屏

使用IDEA打开项目&#xff0c; 不知名原因崩溃了&#xff0c; 直接出现缩略图白屏。 解决过程&#xff1a; 尝试过重启IDEA&#xff0c;重启过电脑&#xff0c;重新引入相同项目&#xff08;使用不同路径&#xff0c;存在缓存记录&#xff0c;依然打不开&#xff09;&#xff…

Java面试题之分布式/微服务篇

经济依旧不景气啊&#xff0c;如此大环境下Java还是这么卷&#xff0c;又是一年一次的金三银四。 兄弟们&#xff0c;你准备好了吗&#xff1f;冲冲冲&#xff01;欧里给&#xff01; 分布式/微服务相关面试题解 题一&#xff1a;CAP理论&#xff0c;BASE理论题二&#xff1a;…

2月22日作业,按键中断LED灯控制

1.使用GPIO子系统&#xff0c;编写LED驱动&#xff0c;应用程序测试 mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include <linux/of.h> …

虚拟机器centos7无法识别yum 命令异常处理笔记

问题现象 启动虚拟机后执行ipconfig 提示未找到该命令,然后执行yum install -y net-tools提示 curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"的错误 [roothaqdoop~]# ifconfig -bash: ifconfig: 未找到命令 [roothadoop~]# yum install …

小程序列表下拉刷新和加载更多

配置 在小程序的app.json中&#xff0c;检查window项目中是否已经加入了"enablePullDownRefresh": true&#xff0c;这个用来开启下拉刷新 "window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": &q…