seata事务实现

seata笔记

事务模式

  1. AT 默认与主推模式,需要依赖数据库ACID,使用jdbc连接
  2. Saga 长事务,外部数据库等无法使用Tcc模式进行补偿
  3. TCC 代码有侵入,需要写parper,commit,rollback代码,不需要ACID支持
  4. XA 需要数据支持XA模式

架构图

Alt

Spring cloud 集成 AT模式

  1. 使用注解@GlobalTransactional 开启全局事务
  2. 配置数据源代理:DataSourceProxy

AT 原理介绍

AT模式下seata使用演变的两阶段提交协议工作机制。

一阶段:

  1. 解析Sql,
  2. 查询前镜像。
  3. 更新
  4. 查询后镜像
  5. 插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 UNDO_LOG 表中
  6. 注册本地事务,申请全局锁。
  7. 本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交
  8. 将本地事务提交的结果上报给 TC

二阶段回滚:

  1. 收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。
  2. 通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。
  3. 数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理,详细的说明在另外的文档中介绍。
  4. 根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句:
  5. 提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC

二阶段提交

  1. 收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。
  2. 异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。

spring cloud 中seata实现方式:

  1. 自动配置类GlobalTransactionAutoConfiguration,引入GlobalTransactionScanner
  2. GlobalTransactionScanner 的类关系图。在这里插入图片描述
    其中AbstractAutoProxyCreator的wrapIfNecessary方法被重写,判断是否需要被带代理。通过代理的方式引入了GlobalTransactionalInterceptor类。在这里插入图片描述
  3. 处理全局事务。在这里插入图片描述
  4. 获取xid ,设置到ThreadLocal,方便传递在这里插入图片描述
  5. feign中XID的传递。在 SeataFeignClientAutoConfiguration中配置了FeignClient的实现类SeataFeignClient, 在执行请求时将XID设置在header中传递到下游服务。
  6. 由于DataSourceProxy代理了DataSouce,获取的连接Connection也是代理连接ConnnectionProxy,注册分支事务,刷新undo_log,提交本地事务等。在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值