系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
Seata提供XA模式实现分布式事务
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
在当今的分布式应用环境中,确保数据的一致性和事务的可靠性变得越来越具有挑战性。传统的单体应用可以依靠数据库的事务机制来保证数据的一致性,但是在分布式系统中,涉及到多个节点和数据库,事务的管理就变得复杂起来。为了解决这个问题,Seata 应运而生。Seata 是一款开源的分布式事务解决方案,它提供了强大的 XA 模式来实现分布式事务。XA 是一种标准化的事务协议,它允许分布式事务中的各个参与者(数据库、应用服务器等)通过协调器进行协作,以确保事务的原子性、一致性和持久性。
在这篇博客中,我将深入探讨 Seata 的 XA 模式,包括其工作原理、核心组件以及如何使用 Seata 来实现分布式事务。我将提供详细的示例和代码片段,帮助你更好地理解 Seata 的 XA 模式在实际应用中的使用。
无论你是分布式系统的开发者、架构师,还是对分布式事务有兴趣的技术爱好者,这篇博客都将为你提供有价值的信息和实用的指导。让我们一起探索 Seata 的 XA 模式,为构建可靠的分布式应用奠定坚实的基础!
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是XA模式?
XA 模式(eXtended Architecture)是一种用于实现分布式事务的标准协议。它由 X/Open 组织定义,并被广泛应用于企业级应用中。
XA 模式的主要目标是提供一种标准化的方式,使得多个数据库或资源管理器可以参与到一个全局事务中,并保证事务的原子性、一致性和持久性。在 XA 模式下,事务的协调由一个事务管理器(Transaction Manager)负责,而资源管理器(Resource Manager)则负责管理和操作本地的事务。
XA 模式的工作原理如下:
- 应用程序通过事务管理器发起一个全局事务。
- 事务管理器与各个资源管理器建立连接,并向它们传递事务开始的消息。
- 资源管理器准备执行本地事务,并返回准备就绪的消息。
- 事务管理器收到所有资源管理器的准备就绪消息后,发送提交或回滚的指令。
- 资源管理器根据事务管理器的指令执行提交或回滚操作,并返回执行结果。
- 事务管理器收集所有资源管理器的执行结果,并通知应用程序事务的最终状态。
通过 XA 模式,事务管理器可以协调多个资源管理器的操作,确保它们在全局事务中的一致性。这样可以避免数据不一致和其他与分布式事务相关的问题。
需要注意的是,XA 模式通常会带来一定的性能开销,因为它涉及到多个节点之间的通信和协调。因此,在选择使用 XA 模式时,需要权衡事务的一致性要求和性能之间的关系。
注:上面的的资源管理器可以看作为一个事务,而事务管理器就是用来管理事物的
二、什么是Seata
Seata 是一种用于处理分布式事务的开源框架。它的目标是帮助开发者更轻松地在分布式系统中实现事务的一致性和可靠性。
打个比方,Seata 就像是一个协调员,当你需要在多个地方(比如不同的服务器或数据库)同时进行一些操作(比如更新数据)时,Seata 可以确保这些操作要么全部成功,要么全部失败,而不会出现部分成功部分失败的情况。
这样可以避免数据不一致或其他与分布式事务相关的问题,就像是一个团队在完成一项任务时,需要有一个协调员来确保每个人都按照计划完成自己的部分,以保证整个任务的成功完成。
三、Seata的核心组件
- Transaction Coordinator(TC):事务协调器,它是独立的中间件,需要独立部署运行,它维护全局事务的运行状态,接收TM指令发起全局事务的提交与回滚,负责与RM通信协调各个分支事务的提交或回滚。
- Transaction Manager(TM):事务管理器,TM需要嵌入应用程序中工作,它负责开启一个全局事务,并最终向TC发起全局提交或全局回滚的指令。
- Resource Manager(RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器TC的指令,驱动分支(本地)事务的提交和回滚。
核心组件执行流程
- TM向TC发送全局事务请求,全局事务创建成功并生成一个全局唯一的XID,TC在本地数据库中创建事务并加锁。
- TM向所有RM发出prepare阶段的执行请求,要求其准备好相应的分布式事务资源。
- RM开始执行分布式事务,完成对资源的准备工作,并将执行结果返回给TM。
- TM收到所有RM的执行结果后,TM向TC发起针对XID的全局提交或回滚决议,进入到commit或rollback的最终阶段。
- TC调度XID下管辖的全部分支事务完成提交或回滚请求。
四、Seata提供XA模式实现分布式事务的步骤
安装Seata并启动
- 下载Seata服务器:Seata下载地址
- 解压Seata
tar -zxvf seata-server-1.4.2.tar.gz -C /usr/local/
- 启动Seata
nohup sh seata-server.sh -p 9999 -h 192.168.66.100 -m file &> seata.log &
项目引入Seata
- 创建 UNDO_LOG 表
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
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;
- 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
- 修改配置文件YML
seata:
# 注册中心
registry:
type: file
service:
# seata服务端的地址和端口信息,多个使用英文分号分隔
grouplist:
default: 192.168.66.100:9999
tx-service-group: my_test_tx_group
- 服务开启全局事物
@Transactional
@GlobalTransactional//开启全局事务
注:将@GlobalTransactional注解标注在全局事务发起的Service实现方法上,开启全局事务 :GlobalTransactionalInterceptor会拦截@GlobalTransactional注解的方法,生成全局事务ID(XID),XID会在整个分布式事务中传递。 在远程调用时,spring-cloud-alibaba-seata会拦截Feign调用将XID传递到下游服务。只要全局事务中涉及的到的事务都需要完成上面的2,3步骤,并且添加@Transaction注解,全局事务的发起者还要添加@GlobalTransactional注解。
五、Seata实现XA要点
- 全局事务开始使用GlobalTransactional注解
- 每个本地事务方案仍然使用@Transactional标识
- 每个数据都需要创建undo_log表,此表是Seata保证本地事务一致性的关键。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/188980.html