面试-TCC事务

2022-12-01 21:11:58 浏览数 (1)

分布式事务是面试经常被问到的一个问题,今天我们分析一下TCC事务

首先我们看一个场景,如下图

有个订单服务生成订单的时候,会调用库存服务,积分服务,仓储服务的接口,库存服务会进行扣减库存,积分服务进行增加积分,仓储服务更新出仓状态

但是,如果我们的库存服务因某种原因宕机,导致库存服务扣减成功,而其他他服务正常更新,那么数据就会有不一致的问题,因此我们在创建订单的时候,就必须保证各个系统要么都成功,要么都失败,所以就有了分布式事务的出现,

分布式事务有很多,今天我们就说其中一个事务TCC

T(try):一般就是锁定某个资源,设定一个预备类的状态,冻结部分数据,如下图

C(commit),当try阶段都执行成功,这里就是真正进行提交完成,如下图

C(cancel),当try阶段库存失败,这里就进行回滚的操作,如下图

以上就是TCC事务的基本操作, 事务中的每一个接口由原来的一个接口,变成了三个接口,分别是try接口,comfirm接口,cancel接口

  1. 先是调用所有服务的try接口
  2. 如果try都正常,TCC事务就进行Confirm接口
  3. 如果try某个的服务有异常,TCC事务就会进行回滚操作,调用cancel接口

其中我们可以发现,如果订单服务挂了,然后重启,那么之前没有执行完的事务如何处理

其实这里TCC框架会记录分布式事务的活动日志,可在磁盘的日志文件中记录,也可以记录到数据库,保存各个事务的运行阶段和状态

还有就是当cancel和comfirm执行失败,TCC框架也会根据日志记录和状态进行不断尝试,直到成功.

优点

1.保证的跨服务的操作的原子性,保证数据的最终一致性

2.性能的提高,缩小事务的粒度,不会锁定所有资源

缺点

1.和我们的业务耦合度比较高

2.必须保证接口的幂等性

3.记录日志也会是一种性能消耗

0 人点赞