shardingsphere-jdbc集成Seata分布式事务

1、导入相关依赖

        <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingsphere 集成 seata AT 模式 --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-transaction-base-seata-at</artifactId><version>5.5.1</version></dependency><dependency><groupId>org.apache.seata</groupId><artifactId>seata-all</artifactId><version>2.3.0</version><exclusions><exclusion><groupId>org.antlr</groupId><artifactId>antlr4-runtime</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><exclusions><exclusion><groupId>com.netflix.archaius</groupId><artifactId>archaius-core</artifactId></exclusion></exclusions></dependency>

备注:
【1】shardingsphere-transaction-base-seata-at 的版本最好与 shardingsphere-jdbc 版本一致
【2】seata-all 版本最好与 seata-server 服务端版本一致

2、在应用服务的 classpath 目录下创建以下配置文件

【1】sharding-config.yml:用于支持读写分离。这里以应用已经集成了 shardingsphere-jdbc 为前提,可参考:
https://blog.csdn.net/hkl_Forever/article/details/146602740

【2】seata.conf:用于 shardingsphere-jdbc 支持 seata 分布式事务,内容案例如下:

shardingsphere.transaction.seata.at.enable = true
shardingsphere.transaction.seata.tx.timeout = 120client {application.id = order-servicetransaction.service.group = default_tx_group
}service {vgroupMapping.default_tx_group = "default"default.grouplist = "服务IP:8091"
}

备注:
(1)事务组名称可以自定义,但要与seata服务端配置文件(seata-server.yml)中配置的事务组名称一致(否则报错),
(2)注意 default_tx_group、default 的映射关系要对应



【3】registry.conf:用于访问 seata 服务所在的注册中心和配置中心,内容案例如下:

registry {type = "nacos"nacos {serverAddr = "http://nacos服务ip:8850"username = "xxx"password = "xxx"namespace = "xxx"group = "DEFAULT_GROUP"}
}config {type = "nacos"nacos {serverAddr = "http://nacos服务ip:8850"username = "xxx"password = "xxx"namespace = "xxx"group = "DEFAULT_GROUP"dataId = "seata-server.yml" # Seata服务端的配置文件,一定要正确保证能访问到该文件}
}

【4】在集成 seata 服务对应的数据库中创建 undo_log 表,(此为必须,否则全局事务无法回滚),可参考:
https://blog.csdn.net/hkl_Forever/article/details/145803842

3、传递 TX_XID(全局事务id)

【1】在调用方的服务中配置openfeign的接口 RequestInterceptor 的实现类进行传递

@Configuration
public class TransferTxXidInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {//---------------------- 传递 seata 的 TX_XID  start ---------------------String xid = RootContext.getXID();if (StrUtil.isNotBlank(xid)) {requestTemplate.header(RootContext.KEY_XID, xid);}//---------------------- 传递 seata 的 TX_XID  end ---------------------}}

【2】在被调用方的服务中配置 seata 支持的事务传播拦截器,获取调用方传递过来的 TX_XID

@Configuration
public class JakartaSeataConfig {/*** <p>微服务事务传播拦截器(适用SpringBoot 3.x)</p>*/@Beanpublic JakartaSeataWebMvcConfigurer getJakartaSeataWebMvcConfigurer() {return new JakartaSeataWebMvcConfigurer();}//    /**
//     * <p>微服务事务传播拦截器(适用SpringBoot 2.x)</p>
//     */
//    @Bean
//    public SeataWebMvcConfigurer getSeataWebMvcConfigurer() {
//        return new SeataWebMvcConfigurer();
//    }}

4、验证测试,启用微服务应用

调用方代码案例

	@Transactional(rollbackFor = Exception.class)@Overridepublic void saveOrder(AddOrderReq data) {if (ObjUtil.isNull(data)) {return;}//保存订单Order order = BeanUtil.copyProperties(data, Order.class);order.setOrderNo("S-" + IdUtil.getSnowflake().nextIdStr());order.setOrderTotalPrice(ObjUtil.defaultIfNull(data.getOrderTotalPrice(), NumberUtil.toBigDecimal(0.00)));this.save(order);//记录支付流水InsPaymentFlowReq insPaymentFlowReq = new InsPaymentFlowReq();insPaymentFlowReq.setOrderNo(order.getOrderNo());insPaymentFlowReq.setCostPrice(order.getOrderTotalPrice());insPaymentFlowReq.setRemark(order.getRemark());paymentFlowClient.insPaymentFlow(insPaymentFlowReq);ThrowUtil.fail("order服务出错了!");}

被调用方代码案例

    @Transactional(rollbackFor = {Exception.class})@Overridepublic void insPaymentFlow(InsPaymentFlowReq data) {if (ObjUtil.isNull(data)) {return;}PaymentFlow paymentFlow = BeanUtil.copyProperties(data, PaymentFlow.class);paymentFlow.setFlowNo("F-" + IdUtil.getSnowflake().nextIdStr());this.save(paymentFlow);//ThrowUtil.fail("payment服务出错了!");}

经测试验证后,在 shardingsphere-jdbc 读写分离的前提下,服务调用链路中有报错双方都可以正常回滚,符合预期

5、总结注意

【1】shardingsphere-jdbc 集成 seata 与 单数据源集成 seata 完全是各自独立的方式(不搭嘎)

【2】shardingsphere-jdbc 集成 seata 后,切记在主方法上要使用 @Transactional 不能使用 @GlobalTransactional。单数据源集成 seata 则在主方法上使用 @GlobalTransactional 即可

【3】shardingsphere-jdbc 集成 seata 后,如果只使用读写分离场景没问题。但如果使用分片、分库分表场景则 seata 事务不靠谱(不建议分片场景和seata一起使用)

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

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

相关文章

05-DevOps-Jenkins自动拉取构建代码

新建Gitlab仓库 先在Gitab上创建一个代码仓库&#xff0c;选择创建空白项目 安装说明进行填写&#xff0c;然后点击创建项目 创建好的仓库是空的&#xff0c;什么都没有 新建一个springboot项目&#xff0c;用于代码上传使用。 只是为了测试代码上传功能&#xff0c;所以代码…

C#核心(24)结构体和类的区别,抽象类和接口的区别(面试常问)

前言 随着上一节我们对StringBulider的讲解落下帷幕&#xff0c;c#核心的知识点我们也即将告一段落,我们讲完了面向对象要用的三大特性&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;和七大原则。期中自然也不乏一些小的散的碎的的知识点。 今天我们要讲的也…

HTMLCSS实现异环网站,期末web作业

本网站是我在学习前端时敲得&#xff0c;仅供学习使用。 这段代码是一个完整的 HTML 网页项目&#xff0c;包含 HTML、CSS 和 JavaScript 部分&#xff0c;用于构建一个名为 “异环” 的网页。网页具备头部导航栏、主体视频展示、图片交互元素、音乐播放控制、视频弹窗播放以及…

Oracle表的别名不能用as,列的别名可以用as

在 Oracle 数据库中&#xff0c;‌表的别名‌和‌列的别名‌在使用 AS 关键字时确实有不同规则&#xff0c;以下是详细说明&#xff1a; 1. 表的别名&#xff08;Table Alias&#xff09;‌ ‌不支持 AS 关键字‌&#xff0c;直接跟在表名后即可。‌语法示例‌&#xff1a; S…

【SAP ME 44】在 HANA DB中报废SFC时的SHOP_ORDER表记录锁定

症状 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 报废期间持有锁,当同时调用数量较大时,可能会导致 HANA 数据库出现大量锁积压。这有时会导致因等待 HANA 数据库释放“选择更新”锁而导致报废 SFC 花费数分钟。 HANA 数据库日志中的示例: # begin PreparedStatement_ex…

Vscode开发Vue项目NodeJs启动报错处理

文章目录 背景一、npm启动报错报错信息定位原因处理方案第一步、下载安装高版本 二、node 无法识别报错信息处理方案定位原因第一步、检测环境变量第二步、重新开启界面 背景 使用Vscode开发Vue项目&#xff0c;使用到NodeJs&#xff0c;记录出现的问题及处理方案&#xff0c;…

破局遗留系统!AI自动化重构:从静态方法到Spring Bean注入实战

在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了全新的解决方案,能够实现从静态方法到 Spring B…

2025妈妈杯数学建模C题完整分析论文(共36页)(含模型建立、可运行代码、数据)

2025 年第十五届 MathorCup 数学建模C题完整分析论文 目录 摘 要 一、问题分析 二、问题重述 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1代码&#xff08;仅供参考&#xff09; 4.1.4问题1求解结果&#xff08;仅…

【Python爬虫详解】第一篇:Python爬虫入门指南

什么是网络爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动获取网页内容的程序。它可以访问网站&#xff0c;抓取页面内容&#xff0c;并从中提取有价值的数据。在信息爆炸的时代&#xff0c;爬虫技术可以帮助我们高效地收集、整理和分析互联网上的海…

【JavaWeb后端开发02】SpringBootWeb + Https协议

课程内容&#xff1a; SpringBootWeb 入门 Http协议 SpringBootWeb案例 分层解耦 文章目录 1. SpringBootWeb入门1.1 概述1.2 入门程序1.2.1 需求1.2.2 开发步骤1.2.3 常见问题 1.3 入门解析 2. HTTP协议2.1 HTTP概述2.1.1 介绍2.1.2 特点 2.2 HTTP请求协议2.2.1 介绍2.2.2…

MATLAB 控制系统设计与仿真 - 37

范数鲁棒控制器的设计 鲁棒控制器的设计 根据双端子状态方程对象模型结构&#xff0c;控制器设计的目标是找到一个控制器K(s),它能保证闭环系统的范数限制在一个给定的小整数下&#xff0c;即 这时控制器的状态方程为&#xff1a; 其中X与Y分别为下面两个代数Riccati方程的解…

依赖冲突,缺失插件导致无法启动项目 强制安装命令(npm install --legacy-peer-deps)

小白终成大白 文章目录 小白终成大白前言总结 前言 运维工程师说搞一个自动化打包流程 在服务器装了hbuilder 找前端来启动项目 我没启动起来 … 启动报错 failed to load config from D:\zhuque-uniapp\vite.config.js 16:17:31.601 error when starting dev server: 16:17:3…

数据战略新范式:从中台沉淀到服务觉醒,SQL2API 如何重塑数据价值链条?

一、数据中台退烧&#xff1a;从 “战略神话” 到 “现实拷问” 曾几何时&#xff0c;数据中台被视为企业数字化转型的 “万能解药”&#xff0c;承载着统一数据资产、打破业务壁垒的厚望。然而&#xff0c;大量实践暴露出其固有缺陷&#xff1a;某零售企业投入 500 万元建设中…

警惕阿里云中的yum update操作不当导致:/sbin/init被清空导致Linux无法正常启动

由于使用阿里云进行部署测试&#xff0c;因而会对yum update进行操作&#xff0c;这两天更新了systemd-239-82.0.3.4.al8.2.x86_64&#xff0c;但存在报错&#xff0c;然后进行yum history undo和清空yum cache&#xff0c;但出现操作Linux命令行无效。具体来说&#xff0c;几个…

论文阅读:2023 ICLR Safe RLHF: Safe Reinforcement Learning from Human Feedback

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Safe RLHF: Safe Reinforcement Learning from Human Feedback 安全 RLHF:通过人类反馈进行安全强化学习 https://arxiv.org/pdf/2310.12773 https://github.com/PKU-Alignment/safe…

android rom打包解包工具,Android ROM定制:boot.img、recovery解包打包

安卓boot.img和recovery.img解析与修改指南 安卓映像文件结构解析 大家都知道安卓的核心更换是在boot.img里面&#xff0c;那么如何在Windows下解开它呢&#xff1f;这里介绍一个实用的方法。 首先需要获取bootimg.exe工具&#xff0c;这个工具最初是为华为设备开发的&#…

cdp-(Chrome DevTools Protocol) browserscan检测原理逆向分析

https://www.browserscan.net/zh/bot-detection 首先,打开devtools后访问网址,检测结果网页显示红色Robot,标签插入位置,确定断点位置可以hook该方法,也可以使用插件等方式找到这个位置,本篇不讨论. Robot标签是通过insertBefore插入的. 再往上追栈可以发现一个32长度数组,里面…

PostgreSQL 通过 copy 命令导入几何数据 及 通过 CopyManager.copyIn() 导入几何数据

COPY命令介绍 copy是postgresql提供的一个专门用于快速导入导出数据的命令,通常用于从文件(TXT、CSV等)或标准输入输出中读取或写入数据。适合批量导入导出数据,速度快。 默认情况下,如果在处理过程中遇到错误,COPY将失败。 COPY只能用于表,不能用于视图!!! COPY…

常用的几种 Vue 父子组件传值方式

1. 父组件向子组件传值(props) 父组件代码:Parent.vue <template><div><h2>父组件</h2><Child :parent-msg="parentMsg" /></div> </template><script> import Child from ./Child.vue;export default {componen…

【1】云原生,kubernetes 与 Docker 的关系

Kubernetes&#xff1f;K8s&#xff1f; Kubernetes经常被写作K8s。其中的数字8替代了K和s中的8个字母——这一点倒是方便了发推&#xff0c;也方便了像我这样懒惰的人。 什么是云原生&#xff1f; 云原生&#xff1a; 它是一种构建和运行应用程序的方法&#xff0c;它包含&am…