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

一. 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客户端,上面也有说明连接的数据库

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

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个使用 Seata分布式事务的示例: 1. 创建一个 Spring Boot 项目并添加 Seata 的依赖: ```xml <dependency> <groupId>io.seata</groupId> <artifactId>seata-all</artifactId> <version>${seata.version}</version> </dependency> ``` 2. 在 Seata 的配置文件中指定注册中心和事务组名称: ```yaml seata: enabled: true application-id: ${spring.application.name} tx-service-group: my_tx_group registry: type: nacos nacos: server-addr: ${nacos.server-addr} config: type: nacos nacos: server-addr: ${nacos.server-addr} group: SEATA_GROUP namespace: ${nacos.namespace} ``` 3. 在需要使用分布式事务的方法上添加 `@GlobalTransactional` 注解: ```java @Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private AccountService accountService; @GlobalTransactional public void createOrder(Order order) { // 创建订单 orderMapper.insert(order); // 扣减账户余额 accountService.reduceBalance(order.getUserId(), order.getTotalAmount()); } } @Service public class AccountService { @Autowired private AccountMapper accountMapper; @GlobalTransactional public void reduceBalance(Long userId, BigDecimal amount) { // 扣减账户余额 Account account = accountMapper.selectByUserId(userId); account.setBalance(account.getBalance().subtract(amount)); accountMapper.updateByPrimaryKeySelective(account); } } ``` 在上面的示例中,`createOrder` 方法和 `reduceBalance` 方法都添加了 `@GlobalTransactional` 注解,表示它们需要参与到一个全局事务中。 当 `createOrder` 方法被调用时,Seata 会自动开启一个全局事务,并将这个方法的执行过程作为一个分支事务注册到 Seata 中。然后调用 `reduceBalance` 方法时,Seata 会将它也作为一个分支事务注册到 Seata 中。 最后,当 `createOrder` 方法执行完毕时,Seata 会将所有分支事务进行一次全局提交或回滚,确保整个分布式事务的一致性。 希望这个示例对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全能技术师

相关资源在博客首页资源下获取

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值