TCC本质用的是不是2PC模型??

张开发
2026/4/21 1:44:17 15 分钟阅读

分享文章

TCC本质用的是不是2PC模型??
文章目录1. 为什么说 TCC 是 2PC2. 它们之间最大的区别是什么3. 既然都是 2PC为什么要发明 TCC痛点解决 XA 的“长事务阻塞”4. 总结没错你的洞察力非常敏锐。TCC 本质上就是 2PC两阶段提交在“业务层”的一种变阵实现。虽然它和原生的 XA2PC在表现形式上大不相同但在逻辑内核上它们共享同一套基因。1. 为什么说 TCC 是 2PC我们把 2PC 的标准定义和 TCC 放在一起对照你一眼就能看出来阶段2PC (标准模型)TCC (业务模型)核心目标第一阶段Prepare(准备)Try(尝试)资源检查与预留。确认钱够不够、库存够不够并把这部分资源锁住冻结。第二阶段Commit(提交)Confirm(确认)正式执行。真正扣掉冻结的钱真正减掉预留的库存。第二阶段 (异常)Rollback(回滚)Cancel(取消)释放预留。把冻结的钱还回去把预留的库存解冻。2. 它们之间最大的区别是什么虽然模型一样但**“执行层”**发生了降维XA (原生 2PC)是数据库在帮你玩。数据库内核负责锁行、写日志、等指令。对程序员来说是透明的不用写代码。TCC (业务 2PC)是程序员在玩。Seata 只负责传达指令具体的Try逻辑比如往freeze_amount字段加钱、Confirm逻辑、Cancel逻辑全都得你手写 SQL实现。3. 既然都是 2PC为什么要发明 TCC你可能会想既然 XA 已经是 2PC 了为什么要费劲手写 TCC痛点解决 XA 的“长事务阻塞”XA 的 2PC第一阶段Prepare完成后数据库的行锁、连接全都不能释放。如果第二阶段指令因为网络原因迟迟不到数据库就卡死了。TCC 的 2PC在Try阶段它执行的是一个完整的本地事务并提交释放了数据库物理锁和连接。它所谓的“锁”是业务逻辑锁比如把 100 元从available字段转到frozen字段。核心优势第一阶段完事后数据库连接就还给连接池了大大提升了高并发下的系统吞吐量。4. 总结TCC 是 2PC 协议在应用层的应用。XA叫“强一致性 2PC”由数据库保证。TCC叫“补偿型 2PC”由业务代码保证最终一致性。这也是为什么在面试时面试官问完 2PC 紧接着就会问 TCC因为它们其实是一根藤上的两个瓜一个是系统级的一个是应用级的。你现在是不是在想既然 TCC 是手写代码那万一Confirm或者Cancel方法执行失败了比如网络断了Seata 是怎么保证它一定能补救回来的这其实就涉及到了我们之前聊过的TC 重试机制和幂等性问题了。

更多文章