1、什么情况下会存在分布式事务?

分布式事务存在的情况.png
第一种:两个不同的服务提供方调用同一个数据源,且A服务提供方有调用B服务提供方
分布式事务存在的情况2.png
第二种:两个不同的服务提供方调用不同的数据源,但是A服务提供方有远程调用B服务提供方。

2、Seata的TC、TM、RM的含义,以及Seata的工作原理

TC(Transaction Coordinator):事务协调者,维护全局和分支事务的状态,驱动全局事务的提交和回滚(TM之间的协调者),在项目中就是seata-server
TM(Transaction Manager):事务管理器,定义全局事务范围(开始全局事务、提交或回滚全局事务)
RM(Resource Manager):资源管理器,管理分支事务处理的资源,与TC交谈分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
分布式事务的执行流程.png
seata的工作流程:
1)在服务引入seata-server依赖,开启seata服务;
2)开启全局事务,创建全局事务ID即XID;在本项目的品牌和文件服务的分布式事务中,TM是model-shop-webweb下的BrandController类下的createBrand()的方法;
3)将全局事务的XID保存到数据库的三张表中,branch_table(分支事务表),global_table(全局事务表),lock_table(全局锁表)
4)在RPC(远程调用)RM时,把XID传递给服务的提供方;在本项目RM(资源管理器)是服务的提供方
5)分支事务携带XID将信息注册到TC(事务协调者)中;
6)TC接收到了TM和RM所有提交的信息后,来决策是否提交/回滚;
7)如果TC决议是提交,那么就给TM发起成功执行的通知(commit);如果是回滚,那么就给TM发起失败回滚的通知
注意点:TC始终只有决策和决议的权利,执行权力在TM上。

3、seata是怎么进行事务信息收集的?

seata事务信息的收集.png
Seata信息收集阶段(undo_log)是第一阶段。在业务SQL执行时,会提取SQL的元数据,将修改前的数据使用快照的方式保存到undo_log中,再执行SQL且将修改后的数据也是使用快照的方式保存到undo_log中,且这条被修改的数据利用**SELECT FOR UPDATE**语句申请一个全局锁(数据库的行锁)。如果一直拿不到锁就需要回滚本地事务。

4、seata的TC是如何做事务决议的?

seata事务决议全局提交的流程.png
第一种TC决议是全局提交,到这一阶段各个分支事务都已提交成功并且把消息发送给TC,TC会向各个分支发送第二阶段的请求(这个请求会被放入一个异步任务队列中)。各个分支收到TC的提交请求后,马上返回提交成功结果给TC。异步队列中根据业务ID批量查找并删除响应的undo_log回滚记录
seata事务决议全局回滚流程.png
第二种TC决议是全局回滚:各个分支RM收到TC发来的回滚请求,通过XID和业务ID找到响应的回滚日志记录,通过回滚记录生成反向的更新SQL并执行,据此完成分支的回滚,回滚完毕后删除undo_log记录。

5、seata-all、seata-spring-boot-starter、spring-cloud-starter-alibaba-seata三个依赖之间的区别?

依赖 支持yml配置 实现XID传递 支持数据源自动代理 自动初始化(GlobalTransactionScanner入口)
seata-all
seata-spring-boot-starter
spring-cloud-starter-alibaba-seata