分布式事务解决方案AT模式

AT模式是Seata框架中的一种分布式事务解决方案,它利用两阶段提交(2PC)的概念,通过日志记录(在undo_log中)来实现在分布式系统中数据的一致性。AT模式可以解决分布式事务中的数据不一致问题,适合于RPC和微服务架构。

工作原理

AT模式通过以下两个阶段来保证分布式事务的一致性:

  1. 一阶段(Prepare阶段):业务数据和回滚日志(undo_log)记录

    • 在业务操作的同时,记录业务操作前后的数据状态,生成回滚日志并保存在undo_log表中。
  2. 二阶段(Commit/Rollback阶段):事务提交或回滚

    • 如果一阶段成功,二阶段将提交所有局部事务,并且异步清除undo_log。
    • 如果一阶段中的任何操作失败,二阶段将根据undo_log中的信息回滚已执行的局部事务。

核心组件

  • TC (Transaction Coordinator):事务协调器,维护全局事务状态,协调事务的提交或回滚。
  • TM (Transaction Manager):事务管理器,定义全局事务的范围,负责开启和结束事务。
  • RM (Resource Manager):资源管理器,管理分支事务处理的资源。

示例代码

假设您的系统中有订单服务和库存服务,您希望在创建订单的同时扣减库存。使用Seata进行事务管理的代码如下:

首先,配置Seata代理数据源:

@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource(DataSourceProperties properties) {HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl(properties.getUrl());dataSource.setUsername(properties.getUsername());dataSource.setPassword(properties.getPassword());// 使用Seata对数据源进行包装return new DataSourceProxy(dataSource);}
}

然后,定义全局事务的业务逻辑:

@Service
public class BusinessService {@Autowiredprivate OrderService orderService;@Autowiredprivate InventoryService inventoryService;@Transactional // 本地事务注解@GlobalTransactional(timeoutMills = 300000, name = "fsp-create-order") // Seata全局事务注解public void purchase(String userId, String commodityCode, int orderCount) {// 1. 创建订单orderService.createOrder(userId, commodityCode, orderCount);// 2. 扣减库存inventoryService.deduct(commodityCode, orderCount);}
}

业务服务中,订单服务和库存服务的实现可能如下:

public class OrderService {// 注入数据源或使用JdbcTemplate等public void createOrder(String userId, String commodityCode, int orderCount) {// 实现创建订单的逻辑// 此处会有数据库操作,例如插入订单记录}
}public class InventoryService {// 注入数据源或使用JdbcTemplate等public void deduct(String commodityCode, int orderCount) {// 实现扣减库存的逻辑// 此处会有数据库操作,例如更新库存数量}
}

细节分析

在使用AT模式时,需要注意以下关键点:

  • undo_log表:确保数据库中有undo_log表,用于记录数据变更日志。
  • 隔离级别:AT模式需要合适的隔离级别来避免脏读、幻读等问题。
  • 幂等性:为了防止重复执行,需要确保业务逻辑的幂等性。
  • 超时控制:设置合适的超时时间是重要的,防止事务挂起过久影响系统性能。
  • 资源锁:Seata会锁定事务涉及的资源,需关注锁的粒度和持有时间。
  • 服务降级:在Seata服务不可用时,应有降级策略保证业务可继续执行。

注意

实际部署Seata和AT模式,需要详细阅读Seata官方文档,并根据具体环境进行配置。以上代码演示是一个简化的例子,实际应用可能涉及更复杂的配置和错误处理策略。

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

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

相关文章

使用esp32 cam + SR602人体感应模块制作一个小型的监控

需求: 做一个小型的监控,类似电子猫眼,监测到人之后,取一张图 然后发送到自己的邮箱。 架构: 1.sr602 传感器监测到人 2. esp32 cam 取图 并通过mqtt协议传到远端服务器 3, 服务器利用python 搭建一个mqtt客户端&…

【Jenkins】Jenkins关闭Jenkins关闭、重启

目录 一、Jenkins关闭、重启 二、Jenkins服务的启动、停止方法。 一、Jenkins关闭、重启 1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit,关闭Jenkins服务。 例如:http://localhost:8081/exit 2.重启Jenkies 只有在Jenkins服务启动…

webrtc native api的几个要点

文章目录 基本流程状态回调类sdp的中媒体行pc对象 基本流程 webrtc native的接口,主要就是围绕着PeerConnection对象,一个PeerConnection对象它代表了一次音视频会话。 那么通过PeerConnection对象建立音视频通话,包括如下步骤: …

第三篇:跨平台QT开发-正则表达式和文件处理

正则表达式 正则表达式即一个文本匹配字符串的一种模式,Qt 中 QRegExp 类实现使用正则表达式 进行模式匹配,且完全支持 Unicode,主要应用:字符串验证、搜索、查找替换、分割。 正则表达式中字符及字符集 元素含义 c 匹配字符本…

【WebSocket】微信小程序原生组件使用SocketTask 调用星火认知大模型

直接上代码 微信开发者工具-调试器-终端-新建终端 进行依赖安装 npm install base-64 npm install crypto-js 然后顶部工具栏依次点击 工具-构建npm // index.js const defaultAvatarUrl https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQ…

4、ChatGPT 无法完成的 5 项编码任务

ChatGPT 无法完成的 5 项编码任务 这是 ChatGPT 不能做的事情的一个清单,但这并非详尽无遗。ChatGPT 可以从头开始生成相当不错的代码,但是它不能取代你的工作。 我喜欢将 ChatGPT 视为 StackOverflow 的更智能版本。非常有帮助,但不会很快取代专业人士。当 ChatGPT 问世时…

@ 代码随想录算法训练营第7周(C语言)|Day41(动态规划)

代码随想录算法训练营第7周(C语言)|Day41(动态规划) Day41、动态规划(包含题目 ● 343. 整数拆分 ● 96.不同的二叉搜索树 ) 343. 整数拆分 题目描述 给定一个正整数 n,将其拆分为至少两个正…

鸿蒙开发系列教程(十四)--组件导航:Tabs 导航

Tabs 导航 Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabBar是导航页签栏 每一个TabContent对应的内容需要有一个页签,可以通过TabContent的tabBar属性进行配置 设置多个内容时,需在Tabs…

Maven构建OSGI+HttpServer应用

Maven构建OSGIHttpServer应用 官网(https://eclipse.dev/equinox/server/http_in_equinox.php)介绍有两种方式: 一种是基于”org.eclipse.equinox.http”包的轻量级实现,另一种是基于”org.eclipse.equinox.http.jetty”包&#…

基于SpringBoot+Vue的实验室管理系统

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

​​​​​​​CleanMyMac X有什么优势?到底好不好用?

当你的Mac开始变得缓慢或者存储空间告急时,这通常是一个清理磁盘空间的信号。无论是工作文件、个人照片、还是各种应用程序,随着时间的推移,它们都可能在你的硬盘上积累了大量数据。有效地管理这些文件不仅可以提高你的工作效率,还…

mybatis mapper sql include用法实现sql块复用

一、总SQL <select id"getxxxMonitorData"resultType"com.xxx.module.system.dal.dataobject.xxx.xxxDO"><include refid"getxxxMonitorDataBaseSql"></include><include refid"whereContent"></include&…

【C++ 二维前缀和】约会

题目描述 从前&#xff0c;小兔发现了一个神秘的花园。 花园是一个 n 行 m 列的矩阵&#xff0c;第 i 行 j 列的花的美丽度为 ai,j&#xff0c;一个合法的约会场所为任意一个正方形子矩阵&#xff0c;定义子矩阵的浪漫度为这个子矩阵的两条对角线上的花的美丽度之和。 现在小兔…

12.0 Zookeeper 数据同步流程

在 Zookeeper 中&#xff0c;主要依赖 ZAB 协议来实现分布式数据一致性。 ZAB 协议分为两部分&#xff1a; 消息广播崩溃恢复 消息广播 Zookeeper 使用单一的主进程 Leader 来接收和处理客户端所有事务请求&#xff0c;并采用 ZAB 协议的原子广播协议&#xff0c;将事务请求…

Python进阶--下载想要的格言(基于格言网的Python爬虫程序)

注&#xff1a;由于上篇帖子&#xff08;Python进阶--爬取下载人生格言(基于格言网的Python3爬虫)-CSDN博客&#xff09;篇幅长度的限制&#xff0c;此篇帖子对上篇做一个拓展延伸。 目录 一、爬取格言网中想要的内容的url 1、找到想要的内容 2、抓包分析&#xff0c;找到想…

如何更改默认浏览器?

打开设置---应用---默认应用 点击你想要设置为默认浏览器的应用&#xff08;假设为Microsoft Edge&#xff09;&#xff0c;点击设置默认值就可以了。

艺术创作和生活的关系

艺术出现在生产劳作中并体现出人们生活、工作、学习中&#xff0c;使人们在不受限制随意发挥缔造发明能力的体现&#xff0c;独立的精神活动领域在它逐渐演变进步的历程中越来越明显&#xff0c;也是一个人精神思想生活中很重要的一部分。艺术随着社会发展而发展。一件完美的艺…

golang通用后台管理项目——Go+Vue通用后台管理项目实战

GoVue通用后台管理项目实战 1、掌握组件中业务逻辑抽离的方法 2、掌握jwt,日志,跨域,鉴权中间件的使用 3、掌握基于gorm的sql多表查询 4、掌握gin-swag的应用 5、掌握go语言开发前后端分离项目的能力 6、从0到1开发完整前后端分离项目的能力 技术栈&#xff1a; go后端 ging…

【Kubernetes】kubectl top pod 异常?

目录 前言一、表象二、解决方法1、导入镜像包2、编辑yaml文件3、解决问题 三、优化改造1.修改配置文件2.检查api-server服务是否正常3.测试验证 总结 前言 各位老铁大家好&#xff0c;好久不见&#xff0c;卑微涛目前从事kubernetes相关容器工作&#xff0c;感兴趣的小伙伴相互…

2月6日作业

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&…