栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Seata

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Seata

咋互相通知的

TC事物协调器,当有一个事务内的服务失败,那么TC会通知其他的服务

第一阶段

TM事物管理器,事务协调器生成事物ID下发给事务管理器,事务ID来识别,具体的服务是在那个事物中的,资源管理器RM每一个模块都有,本地事务,回滚都是RM,会先去TC注册一个分支事务,之后执行模块,成功,通过rm发给TC,最后TC把模块执行结果下发给TM

第二阶段

TM进行判断所有的模块的执行结果,执行是否回滚或者提交

Seata-AT事务

举个栗子:

修改数据的时候,底层会先去查旧数据,之后替换,然后再去查询这个数据,再将数据放到日志数据库中

搭建TC事务协调器

1.解压分布式事务seata-server-1.3.zip

2.修改三个配置

registry.conf 配置注册中心

file.conf 配置数据库,日志存放的位置

seata-server.bat 修改启动配置,减少内存的使用

3.cmd 运行seata-server.bat

必须用jdk1.8运行命令窗口不能关闭窗口中内容不能选中 添加Seata at事务

1.父项目添加seata依赖

        

2.三个配置文件

        application.yml(设置一个事务组的名字,同个事务里的模块事务组要相同)

        registry (注册中心的地址)  配置的要去注册中心找,连接事务协调器

        file.conf (事务组对应使用的事务协调器)

TC协调器可以配置多个解决高并发问题

3.创建一个数据源代理对象,添加自动配置类

知识点:配置文件可以直接互相引用

配置类文件中用的是HikariDataSource连接池,其中有个jdbc-url要单独设置

spring 无法分辨该注入拿一个对象的时候设置@Primary设置首选项

其次要去排除spring默认的数据源自动配置添加

4. 业务方法添加注解

控制本地事务:@Transactional在第一个模块,启动全局事务:@GlobalTransactional Seata TCC事务

AT事务适用于80%的业务场景(多数情况下)

在一些复杂的情况下,无法自动控制全局事务的执行

需要手动控制事务,没有自动的代码提供了

举个栗子:数据库中有自定义函数,自己写的存储过程的代码,保存到数据库里,当上传数据的时候,想要自己指定具体操作代码的时候,AT就不好使了

TCC(完全手动)

两个阶段的三种操作

第一阶段

try 预留资源 冻结数据

减库存:要减掉的库存先进行预留、冻结建账户:   要扣减的金额先进性预留、冻结第二阶段

​​​​​​​Confirm -确认提交

​​​​​​​减库存:使用一阶段冻结的库存完成业务数据的处理减账户:使用一阶段冻结的金额,完成账户扣减Cancel - 取消、回滚

减库存:使用一阶段冻结的库存  恢复回去减账户:使用一阶段冻结的金额,恢复回去

        原表基础上要添加一个冻结字段或者专门建一个冻结表(表里只存id与冻结的数据)

具体操作案例

添加TCC事务

    新建 Empty project: seata-tccseata-at无事务版本.zip 解压到 seata-tcc 目录在 seata-tcc 工程中导入模块添加 seata 依赖三个配置文件

    application.ymlregistry.conffile.conf修改Mapper,添加 TCC 的数据库操作按 seata tcc 规则,定义 TccAction 接口和实现

       

8.修改业务方法,冻结数据

9.在第一个模块的业务方法上,添加 @GlobalTransactiona

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/750571.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号