写点什么

seata-golang 一周年回顾,java 面试准备内容

用户头像
极客good
关注
发布于: 刚刚

2020 年 4 月,我们开始基于 Seata 着手做多语言 golang 项目,经过一年时间的开发,很高兴 seata-golang 发布了 1.0.0 版本。


今年 4 月 17 号,有幸在成都 gopher meetup 上将 seata-golang 介绍给热衷于 golang 的 gopher。




会上我们向大家演示了如何利用 seata-golang 来接入到微服务中保证服务间的数据一致性,另外还向大家介绍了 Seata 的核心原理、MySQL driver 原理和接入、seata-golang 的未来规划,最后就大家关注的 Seata 相关的问题做了 QA。



[](


)Seata 原理




活动上,我们结合 seata-golang 的 demo 和大家分享了 seata 的工作原理。如下图所示,是一个 seata at 模式的简单工作流程。


![4.png](https://img-blog.csdnimg.cn/img_convert/398a16fdfaa529a9de5befbf3315889


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


c.png)


  • TC(即图中右半部分):Transaction coordinator,它是一个分布式事务协调器。

  • TM:Transaction manager,它是一个事务管理器,负责全局事务的开启、提交和回滚。

  • RM:Resource Manager,它是管理分支事务资源的,它加入全局事务组后,向 TC 报告分支事务的执行状态。

  • XID:TM 开启全局事务时,会在 TC 创建一个 GlobalSession,GlobalSession 的全局唯一标识即为 XID。

  • BranchID:RM 向 TC 注册分支事务后,在 TC 侧生成一个 BranchSession,BranchID 全局唯一标识这个 BranchSession。


当 RM 向 TC 报告分支执行失败时,TC 会标记这个 BranchSession 的状态为失败,然后 TM 发起回滚时,TC 根据 XID 找到所有成功执行的事务分支,通知他们进行回滚。


[](


)MySQL Driver




最近研发开源出来的 mysql driver 项目,基于 go-sql-driver/mysql 1.5.0 版本开发,天然集成了 seata-golang 的分布式事务能力,完全支持 database/sql 库这层抽象,由于很多 orm 框架都基于 database/sql 做了封装,所以对 database/sql 的支持意味着 seata-golang 可以完美无缝地接入各种 orm 框架。



driver 的 mysqlTx 对象执行 Commit 或者 Rollback 时,会根据 mysqlConn 的 connCtx 是否有值来决定是否和 tc 交互,报告分支事务的执行状态。如果执行 Commit,connCtx 有值则把 sqlUndoItemsBuffer 中的 undoLog 和业务数据一起提交到数据库,然后报告 tc 事务分支提交的状态(成功还是失败),否则执行正常的提交。如果执行 Rollback,connCtx 有值则回滚然后向 tc 报告分支执行失败,tc 会根据这个状态回滚整个全局事务,connCtx 没有值则只需正常回滚。



上图是 undoLog json 序列化后的结构数据,我们可以看到这条数据修改之前,它的 name 是 “TXC”,修改之后它的 name 是 “GTS”,如果对它进行回滚,则生成一个反向的补偿语句:update product set name = ‘TXC’ since = 2014 where id = 1。如果是 insert 操作,则反向补偿操作为 delete,如果是一个 delete 操作则方向补偿操作为 insert。


[](


)未来规划

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
seata-golang 一周年回顾,java面试准备内容