一、AT模式开发实战
1)准备阶段
2)启动阶段
2)正常提交
3)异常回滚
4)undo_log
before_image
after_image
放开断点
库存跟before_image一致
5)执行流程
二、TCC模式开发实战
1)准备阶段
2)配置多数据源
3)正常提交
4)异常回滚
5)执行流程
通过接口中注解管理后续的二阶段提交和回滚
TCC和AT的区别是需要我们自定义二阶段commit和rollback逻辑
三、Seata AT模式源码解析(Client端)
1)概述
TC主要在Server端,通过Netty进行通讯
2)事务日志rollback_info内容解析
TableRecords
TableMeta
Row
Field
3)事务日志管理器UndoLogManager
4)Seata数据源代理
4.1)DataSourceProxy数据源代理类
没做什么事,主要针对构造方法注入的targetDataSource进行操作
DefaultResourceManager
日常开发表元数据信息配置在properties配置文件中除非更新版本不会变,如果配到配置中心就有机会被改变
4.2)ResourceManager资源管理器(RM)
不开启全局锁可能出现分布式事务过程中数据被其他服务修改,但是效率高
DefaultResourceManager,默认BranchType为AT模式
Seata的jar包
EnhancedServiceLoader通过ResourceManager.class找到此文件获取对应实现类
通过Netty将资源向TC注册
4.3)ConnectionProxy连接代理器类
步骤a:LOCK_RETRY_POLICY.execute()
步骤b:doCommit()——分支事务提交
、
register()
向TC注册分支成功后返回分支Id
将返回的分支Id存储在ConnectionContext中
flushUndoLogs()
步骤2
步骤2
步骤3
步骤3
report()
步骤b:doCommit()——本地事务提交并查询全局锁
步骤c:rollback()
4.4)StatementProxy和PrepareStatementProxy
AbstractStatementProxy
StatementProxy
ExecuteTemplate
SQLRecognizers
通过dbType选择不同数据库,通过sqlType确定Delete、Insert、Select、Update
ExecuteTemplate
ExecuteTemplate
Executor
生成前镜像
默认ONLY_CARE_UPDATE_COLUMNS为true,一般只查更新了的列
5)AT模式的两阶段提交
5.1)一阶段处理
5.2)二阶段的提交处理
addToCommitQueue(context)一般都是先返回二阶段提交状态,接下来再异步删除UndoLog
5.3)二阶段的回滚处理