最近笔者在面试过程中发现,分布式的微服务开发越来越广泛了,越来越多的企业在面试时都需要有微服务的经验,那么在谈到微服务的过程中,很多的面试官都会问到一个问题:有没有接触过分布式事务管理?怎么实现分布式事务管理?
那在这里就先要理解一下,什么是分布式事务管理,在单系统中,事务管理想必大家都很清楚,举个栗子,银行转账的过程中,张三的余额有100元,李四0元,张三要转50元给李四,那么数据库就要保证张三的记录和李四的记录同时修改,要么同时修改,要么不改,那么事务管理就是为了解决这种情况而存在的;单系统中,这种办法很好解决!加个注解就完事了!
现在大多数项目都用的微服务;多个模块之间相互调用频繁,使得我们也要考虑到分布式事务的问题,比如以下这种情况,用户下单后,扣库存失败,那么会导致超卖,如果下单不成功,扣库存成功,会导致少卖,这两种情况都会导致运营成本增加,在严重情况下需要赔偿用户损失;
那么怎么解决这个问题呢?
目前有2种方案,TCC 和 LCN;
TCC解决方案
第一个T:trying,先冻结需要修改的数据,比如库存100卖掉2个,先把卖掉的2冻结起来,库存剩余98;
第二个T:confirm,如果trying操作成功了,就进行确认操作,将冻结的 2 清零,这下库存就真的是98个了;
第三个C:cancel,取消(回滚),如果trying 失败或者异常,进行回滚操作,将冻结的数量 2 加回库存,使库存回滚回原来的数量 2+98=100;
具体执行内容如下图:
LCN解决方案
注意:LCN不生产任何事务,LCN只是本地事物的协调工具,负责管理微服务的事务;
1、创建事务组
2、各个微服务加入事务组
3、所有的服务执行完sql语句后先不提交,而是通知事务管理器;
4、事务管理器收到各个服务操作成功并且没有失败时,会发送消息通知相应的服务执行提交操作;但只要有一个服务在执行过程中出现异常,事务管理器会发生消息通知相应服务进行回滚操作!
管理流程如下:
是是
有一些网站上说的非常详细,虽然详细但是看的人眼花缭乱,反而不好理解,我的这种方式更好的诠释了分布式事务的执行过程,和解决方案!当然,既然是通俗版的,肯定不会讲的那么详细,但是拿去面试还是可以将就用的!