1.是什么?
TCC和2PC都是分布式事务的一种实现方式,2者不同在于,TCC在业务层实现,而2PC在数据库中实现,例如innodb的XA。
2.为什么需要?
如果我们用到了分布式的架构,那么通常就是一个服务一个数据库,我们都知道ACID在一个库中实现并不难,但是如果我们一个事务涉及到了多个数据库,例如下单这一过程,涉及到了账户数据库,库存数据库,怎样解决账户和库存数据库能够同时进行修改或者失败呢,这就是TCC和2PC解决的问题。
3.怎么做?
不管是2PC还是TTC,都可分为3个操作,预留,确认,回滚。
2PC:
预留:首先向每个要操作的数据库发出预留请求,其实相当于一个加锁的操作,要注意一点,一旦预留成功,那么这个事务就必须成功,无论是服务器挂掉了还是后来提交失败了,一定要成功为止。
提交:每一个事务一一提交。
回滚:其中一个事务预留失败,集体回滚。
TCC:其实和2PC差不多,只是在业务层上面实现,但是TCC更加灵活,为什么说他更加灵活呢?2PC从数据库的层面上加上了锁,所以在分布式事务完成之前,其他业务是没有可能读和写的,TCC其实不是加锁操作,更多的是封锁对该字段的读或者写操作,例如现在商品中库存这一字段,现在因为某一用户要购买该商品,进入了预留阶段,那么写操作肯定是不允许的,但是读操作可以吗?在实际中肯定是可以了,因为在一个商城中不可能说因为其中一个人在购买商品,在走购物流程,其他人对这个这个商品还有多少看不见,所以在这个流程的设计中,我们可以关闭写操作,而开放读操作(如果读和写都在同一字段的话),还要注意一点,一旦我们对某一个服务实现了TCC,那么所有的读写操作都应该走服务所提供的接口,因为一旦其他业务可以直接读写该服务所建立的数据库,那么TCC就失去了它的意义。