(Java企业 / 公司项目)分布式事务Seata详解(含Seata+Nacos组合使用)

发布时间:2024年01月13日

一. Seata介绍

?Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,其内部版本在阿里系内部一直扮演着应用架构层数据一致性的中间件角色,帮助经济体平稳的度过历年的双11,对上层业务进行了有力的技术支撑。经过多年沉淀与积累,其商业化产品先后在阿里云、金融云上售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助用户快速落地分布式事务解决方案。

?官方网站:?Seata

?找到对应的版本进行下载: 下载地址:?Releases · apache/incubator-seata (github.com)

?或者博主提供的两个版本一个是最新版2.0.0 一个是现在使用的是1.6.1版本

【免费】?Seata是一款开源的分布式事务解决方案资源-CSDN文库

Seata术语

TC (Transaction Coordinator) - 事务协调者?

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器?

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器?

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

二. Seata分布式事务原理

官方文档就是最好的文档,多看官方的

?以下是Seata分布式事务四个模式的总结可以参考

  • AT模式,默认,简单,需要增加undo_log表,生成反向SQL,性能高,回滚后原来没数据的,现在还是没数据
  • TCC模式,try confirm/cancel,三个阶段的代码都得自己实现,Seata只负责调度对业务代码侵入性比较强,必要时可能还要修改数据库
  • SAGA模式,长事务解决方法,需要程序员自己编写两阶段的代码(AT模式不需要写)基于状态机来实现的需要一个JSON文件,可异步执行
  • XA模式,XA协议是由X/Open 组织提出的分布式事务处理规范基于数据库的XA协议来实现2PC又称为XA方案适用于强一致性的场景比如金融,银行等需要数据库本身支持XA协议可以跨数据库

Seata分布式事务体验

修改数据库字段,seata的AT模式会自动生成反向SQL,且没有反引号‘’,所以要求表里面不能有关键字,并且在模块中添加数据库表,我们使用的是AT模式

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;

然后添加seata分布式组件依赖,查看maven是否添加进来了依赖client和server都是用的1.6.1

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

接下来就是项目中的配置文件的配置,第一个可以使不做配置,这三个配置项都有默认值,默认客户端的tx-service-group=default_tx_group,最后一个是seata默认端口

?之后代码已修改就是增加或者换成@GlobalTransactional注解, 全局事务注解

下载安装seata之后不需要修改任何配置就可以直接启动

在配置文件配置的默认端口是8091 ,下面显示的是7091的原因?

?在我们的模块配置以上之后启动这个时候就会显示是否连接上了seata客户端,上面也有说明连接的数据库

?可以在代码中加入显示这个,发现全部都是一样的

文章来源:https://blog.csdn.net/qq_60870118/article/details/135573560
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。