五TCC-transaction的事务执行流程
五 TCC-transaction的事务执行流程
四 TCC-transaction的事务执行流程
tcc调用方法是以@Compensable来标识的,spring bean方式调用时,会被事件拦截器和资源协调拦截器拦截。
事件拦截器会控制整个try-confirm-cancel流程,以下对这三个流程进行详细说明。
4.1 try流程
A1 开启主事务。 #
事件上下文为空,走主事务流程,开启主事务,即创建主事件和缓存主事件。
A2 创建参与方A。 #
详见事件参与方
A3 保存事件A及参与方A(持久化)。 #
注意:参与方A是作为事件A的组成部分存储的,因此一次存储操作即可
A4 执行本地try方法 #
本地try方法,里面可能包含其他逻辑,这里只关注分支事务的远程调用。
A4.1 调用B服务try方法 #
- A4.1.1 添加参与方B
- A4.1.2 保存参与方B(持久化)
- A4.1.3 RPC调用B服务+事件上下文状态:TRYING,执行服务B上分支事务try阶段
这里涉及到事件上下文,在微服务中传递,传递方式与具体微服务类型有关,感兴趣可查看
- A4.1.4 更新参与方状态为TRY_SUCCESS
调用一个B服务的rpc-clientB的try方法,此方法被@EnableTcc修饰,从而被资源协调拦截器拦截。
如CapitalFeignClient中写法
@FeignClient(name = "capital", url = "http://localhost:8082/tcc-transaction-http-capital/") public interface CapitalFeignClient { @EnableTcc @RequestMapping(value = "/tradeOrder/record", method = RequestMethod.POST) @ResponseBody String record(@RequestBody CapitalTradeOrderDto tradeOrderDto); }
A4.2 调用C服务try方法 #
- A4.2.1 添加参与方C
- A4.2.2 保存参与方C(持久化)
- A4.2.3 RPC调用C服务+事件上下文状态:TRYING,执行服务C上分支事务try阶段
- A4.2.4 更新参与方状态为TRY_SUCCESS
调用一个C服务的rpc-clientC的try方法,此方法被@EnableTcc修饰,从而被资源协调拦截器拦截。
如RedPacketFeignClient中写法
@FeignClient(name = "redPacket", url = "http://localhost:8083/tcc-transaction-http-redpacket/") public interface RedPacketFeignClient { @EnableTcc @RequestMapping(value = "/tradeOrder/record", method = RequestMethod.POST) @ResponseBody String record(@RequestBody RedPacketTradeOrderDto tradeOrderDto); }
A5 更新参与方A状态为TRY_SUCCESS #
A6 执行confirm/cancel流程。 #
在B服务中try阶段 #
源码可查看:
CompensableTransactionInterceptor.providerMethodProceed(try逻辑)
ResourceCoordinatorInterceptor.interceptTransactionContextMethod方法(添加参与方)
B1 开启分支事务 #
事件上下文非空,走分支事务流程,开启分支主事务,即构建分支事件。
B2 添加参与方B #
B3 保存化事件B和参与方B(持久化) #
注意:参与方B是作为事件B的组成部分存储的,因此一次存储操作即可
B4 执行本地try方法 #
B5 更新参与方状态为TRY_SUCCESS #
B6 更新事件状态为TRY_SUCCESS #
B7 更新事件B(持久化) #
在C服务中try阶段 #
源码可查看:
CompensableTransactionInterceptor.providerMethodProceed(try逻辑)
ResourceCoordinatorInterceptor.interceptTransactionContextMethod方法(添加参与方)
C1 开启分支事务 #
事件上下文非空,走分支事务流程,开启分支主事务,即构建分支事件。
C2 添加参与方C #
C3 保存化事件C和参与方C(持久化) #
注意:参与方C是作为事件B的组成部分存储的,因此一次存储操作即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构