springcloud(八) - 分布式事务seata
术语
TM(transaction manage)事务管理器: 分布式事务的发起和终结者,负责提交和回滚全局事务。
TC(transaction coordinatorr)事务协调器: 协调全局事务和本地事务的运行。
RM(resource manage)资源管理器:本地事务的运行。
分布式事务执行流程
1. Business服务为TM 向TC申请创建全局事务和创建XID。
2. TM获取XID后,携带XID进行远程调用。
3. 各本地事务获取到XID后,创建本地事务后与TC通信报告本地事务执行结果
4. TM根据TC返回结果决定全局事务的提交还是回滚。
5. TC调度XID下所有的本地事务进行提交或回滚。
事务模式 - AT(默认)
mysql回滚表结构
上图中的stock服务,执行了update product set name = 'GTS' where name = 'TXC'; ,内部执行步骤如下
第一阶段:更新语句与本地事务提交,并把结果反馈给TC
1. 解析SQL, 获取表product, 类型update、条件name = 'TXC'
2. 查询SQL, 获取查询前的镜像 select id,name , since from product;
3. 执行update
4. 查询更新后的镜像 select id,name , since from product;
5. 回滚语句插入回滚表,包含修改前和修改后的值。
6. 提交update和事务,并把提交结果报告给TC
第二阶段:
本地事务有回滚,则全局事务回滚。本地事务根据回滚log表再开启事务执行回滚语句并把执行接口告知TC.
无回滚,则删除本地回滚语句。
写隔离设计
原因:回滚查询log的时候可能修改后的值被别人改了,这样就需要设置锁保证数据一致性。
tx1 tx2两个事务都需要对a表中的m列进行修改,正常的执行步骤如下
1. tx1先获取本地锁 执行update语句,等待获取全局锁就能提交,释放本地锁。
2. tx2获取本地锁 执行update语句,等待获取全局锁。
3. tx1全局锁释放后,tx2才能获取到全局锁,才能提交并且释放本地锁。
参考:https://blog.csdn.net/qq1309664161/article/details/126548748
事务模式 - XCC
事务模式 - SAGA
事务模式 - XA