Seata处理分步式事务

在分布式中,存在一对多的数据库的情况,在对数据进行修改时,需要跨数据源进行修改操作,为了保证数据的一致性,因此产生了分布式事务的问题。
SpringCloudAlibabaSeata则可以处理分布式事务的问题。Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
官网地址:http://seata.io/zh-cn/
seata的下载地址:https://github.com/seata/seata/releases
seata的配置,下载解压后,到解压的目录下的conf的
file.conf配置文件:
service模块里的 vgroup_mapping.wjg_tx_group = “deful” 分组自定义名
store模块里的 选择db模式,并在对应的db对象修改数据源
在这里插入图片描述registry.conf配置文件:
选择连接的服务中心方式,以下选择的是nacos,可以加上

在这里插入图片描述
修改以上配置时需要注意,修改需要使用特定的打开包进行修改,免得出现意向不到的错误 可以使用Notepad3进行打开修改。
运行时需先创建seata数据库,sql语句在conf中的db_store.sql中
创建后先运行nacos,接着在运行seata, 在bin目录下找到seata-server.bat双击运行
运行时,若出现闪退,可以在bin目录下进行cmd命令窗口输入seata-server.bat查看错误信息。
以下是我遇到的问题:
一、Exception in thread “main” com.typesafe.config.ConfigException$Parse: file.conf: 20: Key '“?” 出现这个问题,上网查没查到对应的错误,之后重新解压下载包,用Notepad3修改配置,之前用的是pytora进行修改配置,再次启动这个错误就没有了,估计是之前修改时导致文件编译错误了
二、反复报 java.lang.reflect.InvocationTargetException: null 错误,上网查说是mysql版本不对应。我用的seata是0.9.0,该版本里使用的mysql版本是5.1.30的架包,而我使用的是8.0.19的版本,因此需要我把8.0.19的架包替换掉lib目录下的5.1.30架包(一定要替换掉,不能保留), 还需要更改file.conf数据源里的
driver-class-name,改为:“com.mysql.cj.jdbc.Driver”
三、接着又出现Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support. 该异常的意思是要对应时区问题。 因此我们需要在file.conf数据源里的url进行修改 : “jdbc:mysql://127.0.0.1:3306/seata?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true”
加上characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
serverTimezone=UTC 定义时区 UTC是统一的标准世界时间
运行成功为这个样子:
在这里插入图片描述
之后再nacos可以看到注册的配置中心:
在这里插入图片描述
微服务里需要注意的事项:
一、使用Seata的数据库里要有
在这里插入图片描述
日志表,sql语句在conf中的 db_undo_log.sql
二、如果运行微服务中出现no available server to connect 无法创建到数据库服务器的连接 这个异常
出现该问题考虑:
Seata启动所需的【file.conf】文件中,service块下的

vgroup_mapping.my_test_tx_group = “default”

这一行,与微服务项目在application.yml配置文件中的

spring.cloud.alibaba.seata.tx-service-group填写的属性值不一致。

正确的对应写法:
在这里插入图片描述
三、使用的数据库要一致:
在这里插入图片描述
在这里插入图片描述
Seata的实现方式:
seata主要的实现方式是通过@GlobalTransactional这个注解,在处理业务逻辑的方法上添加既可实现全局的事务管理
原理:
处理过程是由Transaction XID+ 三个组件(
Transaction Coordinator(TC) :事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚;
Transaction Manager™ :控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议;
Resource Manager(RM) :控制分支事务,负责分支注册,状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚;)
在这里插入图片描述
简单来讲就是,当我们加上了@GlobalTransactional这个注解就代表我们需要开启全局事务,那么谁通知呢
也就是TM,TM向TC通知要开启全局事务,创建全局事务便有唯一的XID。 接着TC便会管控这个全局事务
而RM就相当于微服务代表它属于该调用链路的一个需要监控(注册分支事务),于是XID便会通过这个链路上下文传播
因此带有这个XID的就代表它属于当前的这个全局事务中的一个成员,处理完成后,TC会通过XID去查看各个分支
事务的处理情况。判断是发出提交还回滚的指令,若其中的一个RM分支事务驱动发出失败,则TC便会发出回滚的指令
给TM,TM接收到指令后,便会执行响应的操作(回滚)
简单明了的说就是:
TC就是seata服务器
TM就是@GlobalTransactional
RM就是各个数据库原

seata有四个事务模式AT、TCC、SAGA、XA,默认的是AT
AT模式时基于本地ACID事务的关系型数据库,java应用,通过JDBC访问数据库
整体机制:
两阶段提交协议的演变:
一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源
二阶段:
2.1提交异步化,非常快速的完成
2.2回滚通过一阶段的回滚日志进行方向补偿
以下断点操作进行查看数据库的储存源:
在seata数据库中有三张表:
一、branch分支表字段
在这里插入图片描述
在这里插入图片描述

二、global全局表字段
在这里插入图片描述

三、look锁表字段
在这里插入图片描述

order中的log日志表
在这里插入图片描述
仔细讲解流程:
第一阶段加载
在这里插入图片描述
假设:
before image: select name,age from where name=XX,age=22 ,id=1 查询原数据保存到order库的log日志表
业务sql: update name,age set name=XX,age=28 from id=1
after image: select name,age from where name=XX,age=28,id=1 查询现数据保存到order库的log日志表
二阶段:
若成功:
在这里插入图片描述

若失败:
在这里插入图片描述

逆向SQL:
假设order执行失败要回滚,数据before image和after image保存在rollback_info 字段里。before image和after image语句就如上面写的一样,你修改了什么就根据条件查询什么,上面修改了name和age。
那么before image就查询name和age,条件为未修改前的name和age,而after image的条件就是修改后的name和age。如果要回滚,那么after image就会逆向查询,将条件改为未修改前的数据:select name,age from where name=XX,age=22 ,id=1。之后相对比若相同则直接回滚,若不相同则人工确认。目的是为了防止脏写。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值