看图秒懂tcc分布式事务

来理解下什么是tcc分布式事务!

下面我们来简单看一个微服务分布式事务的场景!来看图

看图秒懂tcc分布式事务_第1张图片

图中有用户系统!积分系统!资金系统!三个微服务也就是三个小系统!每个系统对应自己的一个数据库,场景是这样的!用户注册。会在用户系统去生成一条用户的纪录。然后在积分系统开通用户的积分纪录!然后会在资金系统去开通用户的资金账户!用户注册的逻辑就是完成这三步操作!用户注册横跨了三个小系统!而且用户注册必须要有事务的保证!也就是说这三步操作其中任何一步操作失败!其它操作都必须回滚!比如说生成用户纪录成功!但生成积分纪录失败!生成成功的用户纪录必须回滚!

 

传统的单点项目是将生成用户纪录生成积分纪录、生成资金账户逻辑都写到一个方法里面!单点项目要实现注册用户的事务很简单。只要在这个方法上面加上个@transaction注解就可以了!开发环境中我们的数据库事物是交给spring框架去处理的。但我们当前的这个场景是横跨了三个系统,三个数据库!!三个jvm!!!!spring也只能回滚当前环境下的jvm应用!说白了spring主能处理同一个数据库的事务!如何实现这个多系统、多数据库之间的事务一致性呢!这就需要我们的分布式事务解决方案来处理了!分布式事务的实现方案方案有几种!目前性能最高的,使用最多的还是tcc 二阶段提交方案!这个也是我们开发人员可控性最高的!后续的章节我们会对cc分布式式调度引擎底层的源码实现做一个深入的分析!

下面我们来了解下什么是tcc 

tcc是分布式事物的一种实现

从字面上的意义主要包含三个方面,try,confirm,cancel

try和confirm称之为两阶段提交

cancel是代码回滚

======2:怎么理解两阶段提交和代码回滚,下面我们去和传统数据库

事物作个对比,就能很清晰易懂了。。

下面大家来看一份demo

这份demo主要功能是使用jdbc往数据库插入数据

看图秒懂tcc分布式事务_第2张图片

开启了手动提交事物

执行了三条insert dml语句

最后提交整个事

如果有catch到异常。回滚整个事物

其实传统数据库事物就存两阶段提交

大家看!!

执行这三条dml语句 其实就一阶段提交。。就是这三个insert

等于我们tcc里面的try..

commit其实就是二阶段提交。等于我们tcc的confirm

这三dml语句的执行就属于一阶段提交,也就等于我们的try阶段,

因为我们开启了手动事物

数据还没有真正提交到数据库。(其实底层是有提交到数据库里去,只是给这些数据加了锁,select查不出这种数据,)

commit  真正提交到数据中去 二阶段提交。 也就是对应的confirm阶段。

rollback等于tcc的cancel

tcc其实就是在模拟数据库事物这一块。。

只不过不同的是,传统数据库事物的两阶段提交和回滚是通过数据内部实现的

而我们的tcc的两阶段提交和回滚是通过代码去做的。

简单来理解tcc其实就是把数据库事物这一块搬到应用层上去。也就是代码层面

====3传统数据库事物和tcc的相同点和不同点。

第一点前面有提到过数据库事物的2阶段提交,回滚是通过数据内部去实现的

,而tcc则是通过设计tcc接口来实现两阶段提交和回滚操作

第二点。传统数据库事物只能操纵当前数据库的事物。不能跨库操作

这句话大家应该能理解吧?

我这个connection只对应一个库。只能提交回滚当前数据库的事物。

保障不了跨库跨应用事物一致性问题。

不能操纵其它的库

但是tcc能作跨库,跨应用的事物提交回滚。保障跨库跨应用的事物一致性问题

更多tcc分布式事务知识www.java52.com

你可能感兴趣的:(看图秒懂tcc分布式事务)