赞
踩
相信有过研发经验的小伙伴都听过这个词"事务”,什么是事务咱们简单举个生活中的例子:比如你去饭店吃饭,你吃完饭就得给钱结账,你不结账人家饭馆老板就不同意,你给钱了但是老板没给你做菜那么你也不同意。所以这个场景就是双方必须全部成功整个过程才算结束。所以事务的定义就是:
事务可以看做是若干个操作共同组成的一件事,这些子事件要么全部成功,要么全部失败。
本地事务其实就是说的是我们传统的单体服务下的数据库事务,我们先回顾一下数据库事务的四大特性 ACID:
如上我们的事务的四个特性,一般我们都是采用spring框架进行开发,所以一般情况都是spring帮我们代理了数据库的事务,比如我们常见的在业务层加上@Transactional注解标识开启事务。
我们从单体服务过渡到分布式服务的过程中就发现在单体服务下的本地事务就失效了。如上图,两个服务或者多个服务进行远程调用存在网络调用,就会出现服务1成功了但是服务2失败了,这样各个服务自己能保证事务进行回滚,但是对于整个调用环节来讲就出现了服务数据不一致,比如服务1是产品服务,服务2是订单服务,订单服务成功了,但是产品服务没有扣减产品。这就出现了数据错误的情况。所以这种情况就需要我们的分布式事务来把控。
分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操 作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如创建订单减产品库存事务,银行转账事务等都是分布式事务。我们简单说一下CAP:CAP是 Consistency、Availability、Partition tolerance三个词语的缩写,分别表示一致性、可用性、分区容忍性。
两阶段提交是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),2是指两个阶段,P是指准备阶段,C是指提交阶段。
再来个生活中的例子:如果你们项目组有2个人,你们两个向老板进行汇报项目成果,准备阶段就是老板要求你们两个同时去汇报结果,提交阶段就是老板很满意给你们一笔奖金。这个就是个事务,如果有一个人不去汇报那么老板都不给奖金。整个事务过程由事务管理器和参与者组成,老板就是事务管理器,这两个项目组成员就是事务参与者,事务管理器负责决策整个分布式事务的提交和回滚,事务参与者负责自己本地事务的提交和回滚。
三阶段提交是基于二阶段提交来到,在提交前增加了一步"CanCommit"询问阶段,事务协调组发送事务请求之前,寻求询问是否可以完成指令,这个过程没有真正的事务操作,这个过程可能有超时而产生事务提交终止。来个图辅助一下理解:
TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认 Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的 操作即回滚操作。
TCC分为三个阶段:
最终一致性是现在各个公司用的比较多的解决分布式事务的解决方案,因为大部分场景下都可以采用最终一致性来保证多个服务的最终一致。我们可以利用消息中间件比如kafka,rocketMQ的可靠性机制来实现数据投递。比如在支付场景中发起支付后等到三方支付平台异步通知结果,在根据状态来设置支付状态之后在加积分,所以这个环节种支付回调成功后我们会发送一个mq消息到中间件种进行通知加积分服务,完成数据的同步。
这个最大努力通知其实和上面的最终一致性方案是类似的,比较适用对于数据一致性要求不高的业务场景,通过不断的回调请求进行通知。我们说个场景:
为阿里开源分布式事务解决方案,对业务代码入侵很小,其核心就是一个注解"@GlobalTransactional",Seata有3个基本组成部分:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。