微服务事务管理(Dubbo)
Seata 是什么
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
一、示例架构说明
可在此查看本示例完整代码地址:dubbo-samples-seata
用户采购商品业务,整个业务包含3个微服务:
- 库存服务: 扣减给定商品的库存数量。
- 订单服务: 根据采购请求生成订单。
- 账户服务: 用户账户金额扣减。


StorageService
public interface StorageService {/*** 扣除存储数量*/void deduct(String commodityCode, int count);
}
OrderService
public interface OrderService {/*** 创建订单*/Order create(String userId, String commodityCode, int orderCount);
}
AccountService
public interface AccountService {/*** 从用户账户中借出*/void debit(String userId, int money);
}
二、主要的业务逻辑
BusinessService
public class BusinessServiceImpl implements BusinessService {private StorageService storageService;private OrderService orderService;/*** 采购*/public void purchase(String userId, String commodityCode, int orderCount) {// 扣除存储数量storageService.deduct(commodityCode, orderCount);// 创建订单orderService.create(userId, commodityCode, orderCount);}
}
StorageService
public class StorageServiceImpl implements StorageService {private JdbcTemplate jdbcTemplate;@Overridepublic void deduct(String commodityCode, int count) {// 修改数据库:扣减存储数量jdbcTemplate.update("update storage_tbl set count = count - ? where commodity_code = ?",new Object[]{count, commodityCode});}
}
OrderService
public class OrderServiceImpl implements OrderService {private AccountService accountService;private JdbcTemplate jdbcTemplate;public Order create(String userId, String commodityCode, int orderCount) {// 计算金额int orderMoney = calculate(commodityCode, orderCount);// 用户账户中扣减金额accountService.debit(userId, orderMoney);// 修改数据库:新建订单final Order order = new Order();order.userId = userId;order.commodityCode = commodityCode;order.count = orderCount;order.money = orderMoney;KeyHolder keyHolder = new GeneratedKeyHolder();jdbcTemplate.update(con -> {PreparedStatement pst = con.prepareStatement("insert into order_tbl (user_id, commodity_code, count, money) values (?, ?, ?, ?)",PreparedStatement.RETURN_GENERATED_KEYS);pst.setObject(1, order.userId);pst.setObject(2, order.commodityCode);pst.setObject(3, order.count);pst.setObject(4, order.money);return pst;}, keyHolder);order.id = keyHolder.getKey().longValue();return order;}
}
AccountService
public class AccountServiceImpl implements AccountService {private JdbcTemplate jdbcTemplate;@Overridepublic void debit(String userId, int money) { // 修改数据库:用户账户中扣减金额 jdbcTemplate.update("update account_tbl set money = money - ? where user_id = ?", new Object[]{money, userId});}
}
三、快速启动示例
Step 1: 下载源码
git clone -b master https://github.com/apache/dubbo-samples.git
cd ./dubbo-samples-transaction/
Step 2: 通过 docker-compose 启动 Seata-Server 和 MySQL 等
在此示例中,我们使用 docker-compose 快速拉起 seata-server 和 mysql 等服务。
cd src/main/resources/docker
docker-compose up
Step 3: 构建用例
执行 maven 命令,打包 demo 工程
mvn clean package
Step 4: 启动 AccountService
java -classpath ./target/dubbo-samples-transaction-1.0-SNAPSHOT.jar org.apache.dubbo.samples.starter.DubboAccountServiceStarter
Step 5: 启动 OrderService
java -classpath ./target/dubbo-samples-transaction-1.0-SNAPSHOT.jar org.apache.dubbo.samples.starter.DubboOrderServiceStarter
Step 6: 启动 StorageService
java -classpath ./target/dubbo-samples-transaction-1.0-SNAPSHOT.jar org.apache.dubbo.samples.starter.DubboStorageServiceStarter
Step 7: 启动 BusinessService
java -classpath ./target/dubbo-samples-transaction-1.0-SNAPSHOT.jar org.apache.dubbo.samples.starter.DubboBusinessTester
四、示例核心流程


Step 1: 修改业务代码
此处仅仅需要一行注解 @GlobalTransactional 写在业务发起方的方法上:
@GlobalTransactionalpublic void purchase(String userId, String commodityCode, int orderCount) {......}
Step 2: 安装数据库
- 要求: MySQL (InnoDB 存储引擎)。
提示: 事实上例子中3个微服务需要3个独立的数据库,但为了方便我们使用同一物理库并配置3个逻辑连接串。
更改以下xml文件中的数据库url、username和password
dubbo-account-service.xml dubbo-order-service.xml dubbo-storage-service.xml
<property name="url" value="jdbc:mysql://x.x.x.x:3306/xxx" /><property name="username" value="xxx" /><property name="password" value="xxx" />
Step 3: 为 Seata 创建 undo_log 表
UNDO_LOG 此表用于 Seata 的AT模式。
-- 注意当 Seata 版本升级至 0.3.0+ 将由之前的普通索引变更为唯一索引。
CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,`ext` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Step 4: 创建相关业务表
DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (`id` int(11) NOT NULL AUTO_INCREMENT,`commodity_code` varchar(255) DEFAULT NULL,`count` int(11) DEFAULT 0,PRIMARY KEY (`id`),UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` varchar(255) DEFAULT NULL,`commodity_code` varchar(255) DEFAULT NULL,`count` int(11) DEFAULT 0,`money` int(11) DEFAULT 0,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` varchar(255) DEFAULT NULL,`money` int(11) DEFAULT 0,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Step 5: 启动 Seata-Server 服务
- 下载服务器软件包,将其解压缩。
Usage: sh seata-server.sh(for linux and mac) or cmd seata-server.bat(for windows) [options]Options:--host, -hThe host to bind.Default: 0.0.0.0--port, -pThe port to listen.Default: 8091--storeMode, -mlog store mode : file、dbDefault: file--helpe.g.sh seata-server.sh -p 8091 -h 127.0.0.1 -m file
相关文章:
微服务事务管理(Dubbo)
Seata 是什么 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 一、示例架构说明 可在此查看本示例完整代码地址&#x…...
Springboot整合ClickHouse
一、快速开始 1、添加依赖 <dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.3.1-patch</version> </dependency> <dependency><groupId>com.alibaba&…...
【材料整理】-- Python、Matlab中常用调试代码,持续更新!
文章目录 Python、Matlab中常用调试代码,持续更新!一、Python常用调试代码:二、Matlab常用调试代码: Python、Matlab中常用调试代码,持续更新! 一、Python常用调试代码: 1、保存.mat文件 from…...
什么是同源策略(same-origin policy)?它对AJAX有什么影响?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 同源策略(Same-Origin Policy)与 AJAX 影响⭐ 同源策略的限制⭐ AJAX 请求受同源策略影响⭐ 跨域资源共享(CORS)⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记…...
视频汇聚/视频云存储/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?
开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流&#…...
CSC2121A
半桥架构的栅极驱动电路CSC2121A CSC2121系列是一款高性价比的半桥架构的栅极驱动专用电路,用于大功率MOS管、IGBT管栅极驱动。IC内部集成了逻辑信号处理电路、死区时间控制电路、欠压保护电路、电平位移电路、脉冲滤波电路及输出驱动电路,专用于无刷电…...
高级进程编程-系统调用-创建守护进程
系统调用 API 参考:用时现查 如何在Linux下的进行多进程编程(初步) - 知乎 (zhihu.com)。 Linux 下系统调用的三种方法_海风林影的博客-CSDN博客。 linux系统调用(持续更新....)_tiramisu_L的博客-CSDN博客。 通过 glibc 提供的库函数、…...
Redis之发布订阅
一、Redis的发布订阅 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscriber):每当有其他客户端向被订阅的频…...
交换机 路由器的常见指令
常用的指令 交换机和路由器是网络中最常见的设备之一,它们都有一些常用的指令。下面是它们的常用指令和解释: 交换机常用指令 show interfaces:显示交换机上的所有接口信息,包括状态、速率、错误信息等。show mac-address-tabl…...
Matlab 基本教程
1 清空环境变量及命令 clear all % 清除Workspace 中的所有变量 clc % 清除Command Windows 中的所有命令 2 变量命令规则 (1)变量名长度不超过63位 (2)变量名以字母开头, 可以由字母、数字和下划线…...
现浇钢筋混泥土楼板施工岗前安全VR实训更安全高效
建筑行业天天与钢筋混凝土砼在,安全施工便成了企业发展的头等大事。 当今社会,人人都奉行生命无价,安全至上。可工地安全事故频繁发生,吞噬掉多少宝贵生命。破坏了多小个家庭?痛定死痛,为了提高施工人员的安全意识。 …...
ARDUINO STM32 SSD1306
STM32F103XX系列SPI接口位置 在ARUDINO 下,(不需要设置引脚功能,不需要开启时钟设置,ARDUINO已经帮我们处理了) stm32f103c6t6 flash不足,不足以运行U8G2,产生错误 改用U8X8,后将字体改为u8x8_…...
临时抱佛脚
马上就要面试了,心里面比较紧张~ 交换型数据结构 在进行网络消息处理的时候,经常会对发送过来的消息进行读写操作。采用普通的方法,需要将读到消息频繁的进行copy操作,这样无疑会降低系统的效率。交换型数据机构指的…...
城市内涝积水监测预警系统 yolov8
城市内涝积水监测预警系统通过yolov8网络深度学习框架,算法一旦识别到道路出现积水,城市内涝积水监测预警系统会立即发出预警信号。并及时通知相关人员。YOLO检测速度非常快。标准版本的YOLO可以每秒处理 45 张图像;YOLO的极速版本每秒可以处…...
数据库备份与恢复
数据库备份的重要性 在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因有:程序错误、人为操作错误、运算错误、磁盘故障、灾难(如火灾、地震)和盗窃。 数据库备份的分类 从物理与逻辑的角度&a…...
ssm+vue高校实验室管理系统源码和论文
ssmvue高校实验室管理系统源码和论文081 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 一.毕业设计的内容 本高校实验室管理系统采用Java语言、MySQL数据库,基于SSM框架进行开发设计&…...
npm报错sass
1.删除node模块 2.删除node-sass: npm uninstall node-sass 3.重新下载对应版本node-sass: npm i node-sass7.0.3(指定版本 控制台报错什么版本就写什么版本) 4.再运行项目 或者...
[系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取数据集详解
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…...
【Cadence】Calculator计算sp的3dB带宽
【Cadence】Calculator计算sp的3dB带宽 1.计算最大增益2.cross函数3. 3dB带宽 下面演示如何在Cadence计算s参数(如增益)的3dB带宽 1.计算最大增益 ymax函数 2.cross函数 cross函数可以计算经过y轴给定值对应的x坐标 edge number选择1是经过的第一个点…...
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)_javascript技巧
若是只引用jquery的话,监听单选按钮改变事件如下: <tr><td align"left" class"bigColor">房屋类型</td><td colspan"5"><input type"radio" name"houseType" id"ho…...
Pixelle-Video完整指南:5分钟掌握AI全自动短视频制作
Pixelle-Video完整指南:5分钟掌握AI全自动短视频制作 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video Pixelle-Video是一款革…...
MCP电路设计:从门电路到CPLD的优先级仲裁硬件实现
1. 项目概述:从“命令打架”到“有序排队”的电路设计在嵌入式系统、工业控制或者任何需要处理多路信号的数字电路里,我们经常会遇到一个头疼的问题:当多个输入信号同时要求一个输出设备执行不同动作时,系统该听谁的?比…...
终极指南:如何用WinDiskWriter快速制作Windows启动盘并绕过硬件限制
终极指南:如何用WinDiskWriter快速制作Windows启动盘并绕过硬件限制 【免费下载链接】windiskwriter 🖥 Windows Bootable USB creator for macOS. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. 👾 UEFI &…...
QGIS连接天地图最新指南:搞定Token和Header,解决加载失败问题
QGIS连接天地图最新指南:搞定Token和Header,解决加载失败问题 天地图作为国内权威的地理信息服务,在QGIS中的集成使用一直是GIS从业者的高频需求。但最近不少用户反馈,按照网上流传的旧教程配置后,天地图服务在QGIS中…...
Vivado 2022.2的.xsa文件,真能通吃Petalinux 2019.2到2022.2吗?我的混搭实测记录
Vivado与Petalinux版本混搭实战:打破常规的.xsa文件兼容性探索 在FPGA开发领域,Xilinx工具链的版本匹配一直被视为金科玉律。但当我们手头只有高版本Vivado,却需要兼容旧版Petalinux环境时,是否真的必须严格遵循官方版本对应表&a…...
Graphviz 高级技巧:如何优化复杂图形的布局与渲染
Graphviz 高级技巧:如何优化复杂图形的布局与渲染 【免费下载链接】graphviz Simple Python interface for Graphviz 项目地址: https://gitcode.com/gh_mirrors/gr/graphviz Graphviz 是一款强大的图形可视化工具,通过其简单的 Python 接口&…...
02. 基本类型
02. 基本类型 1. 概述 TypeScript 的核心特性是静态类型系统。基本类型是 TypeScript 类型系统的基础,包括 JavaScript 原有的原始类型和 TypeScript 新增的特殊类型。 // TypeScript 类型系统概览 ┌──────────────────────────────…...
马来文语音合成效果差?3步诊断法+5个权威音素校准参数,立竿见影提升自然度与语调准确率
更多请点击: https://codechina.net 第一章:马来文语音合成效果差?3步诊断法5个权威音素校准参数,立竿见影提升自然度与语调准确率 马来文(Bahasa Melayu)语音合成常因音素切分模糊、重音规则缺失及语调建…...
5分钟搞定:用WinDiskWriter在Mac上制作Windows启动盘,轻松绕过TPM限制
5分钟搞定:用WinDiskWriter在Mac上制作Windows启动盘,轻松绕过TPM限制 【免费下载链接】windiskwriter 🖥 Windows Bootable USB creator for macOS. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. &#x…...
市面上有哪些是真正高效的降AI率软件(规避AIGC机器检测)
最崩溃的不是查重难题,而是查重达标却AI率超标亮红灯;很多工具只会简单同义词替换、浅层改字,根本洗不掉AI专属句式、行文逻辑和高频模板话术,学校AIGC检测一查一个准,论文直接被标记为AI生成,想答辩都难。…...
