TCC
XA协议包含两阶段提交(Two-phase Commit,2PC)和三阶段提交(3PC)两种实现
2PC、3PC还有TCC都蛮相似的。
3PC大致是把2PC的第一阶段拆分成了两个阶段,
而TCC我感觉是把2PC的第二阶段拆分成了两个阶段。
TCC又称补偿事务。其核心思想是:"针对每个操作都要注册一个与其对应的确认和补偿(撤销操作)"。它分为三个操作:
- Try阶段:主要是对业务系统做检测及资源预留。
- Confirm阶段:确认执行业务操作。
- Cancel阶段:取消执行业务操作。
TCC对应 Try、Confirm、Cancel 三种操作可以理解成关系型数据库事务的三种操作:DML、Commit、Rollback。
在一个跨应用的业务操作中
Try:Try操作是先把多个应用中的业务资源预留和锁定住,为后续的确认打下基础,类似的,DML操作要锁定数据库记录行,持有数据库资源。
Confirm:Confirm操作是在Try操作中涉及的所有应用均成功之后进行确认,使用预留的业务资源,和Commit类似;
Cancel:Cancel则是当Try操作中涉及的所有应用没有全部成功,需要将已成功的应用进行取消(即Rollback回滚)。其中Confirm和Cancel操作是一对反向业务操作。
总结
TCC 实质上是应用层的2PC(),好比把 XA 两阶段提交那种在数据资源层做的事务管理工作提到了数据应用层。
2PC是资源层面的分布式事务,是强一致性,在两阶段提交的整个过程中,一直会持有资源的锁。
TCC是业务层面的分布式事务,最终一致性,不会一直持有资源的锁。
TCC相比较于2PC来讲性能会好很多,但是因为同时需要改造try、confirm、canel3个接口,开发成本高。