Seata初探
最近在研究Seata,阿里的开源的分布式事务中间件,主要应用场景是微服务。
我先探究了AT(Automatic Transaction)模式,特点是0侵入
1.设计
定义 3 个组件来协议分布式事务的处理过程
- Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
- Transaction Manager ™: 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
- Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
简单的说,就是TC负责全局协调,RM则是一个个分支事务,由对应的TM管理,而TM执行相应操作需要由TC批准
2.与XA的区别
最主要的区别在于RM,在XA中,RM归属于DB,而在Seata中,RM归属于APP,从微服务的角度来看,应用层不需要为本地事务和分布式事务两类不同场景来适配两套不同的数据库驱动。剥离了分布式事务方案对数据库在协议支持上的要求。
3.Seata的2PC
- 分支事务中数据的 本地锁 由本地事务管理,在分支事务 Phase1 结束时释放。
- 同时,随着本地事务结束,连接 也得以释放。
- 分支事务中数据的 全局锁 在事务协调器侧管理,在决议 Phase2 全局提交时,全局锁马上可以释放。只有在决议全局回滚的情况下,全局锁 才被持有至分支的 Phase2 结束。
最主要的改变就是在不需要回滚的前提下节省了锁的时间
4.分支事务的回滚
业务数据的更新和回滚日志的写入在同一个 本地事务 中提交。
收到全局回滚的通知后,RM 收到协调器发来的回滚请求,通过 XID 和 Branch ID 找到相应的回滚日志记录,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚