说到分布式事务,大部分人都会知道ACID,两阶段提交,TCC等常见模式。 在微服务大行其道的今天,基于Saga实现的分布式事务则更具普适性。数据库
微服务是将服务粒度控制在上下文内的松耦合的服务架构。对于微服务架构的事务建议对于数据库提供强一致的事务,在服务上下文之间依靠最终一致性方案来解决服务之间协同的问题。json
saga是30年前的一篇数据库论文提到的概念。 论文中定义saga事务是一个长事务,整个事务能够由多个本地事务组成,每一个本地事务有相应的执行模块和补偿模块,当saga事务中任意一个事务出错了,能够调用相关事务进行对应的补偿恢复,达到事务的最终一致性。网络
因为分布式系统中网络带来的不可靠性,saga调用服务提出了服务应该支持幂等,在服务调用超时重试状况下,不至于产生问题。session
saga事务没有准备阶段,不具有隔离性,若是多个saga事务同时操做同一资源会遇到多线程临界资源的状况,产生数据丢失或者脏数据。多线程
为解决隔离性,能够参考TCC模式,在业务层加入session及锁机制保证操做串型化,经过业务层面达到隔离效果。架构
saga在分布式架构下,采用事务驱动方式,让服务进行相关交互,业务方订阅相关领域事件便可。 经过事件方式下降系统复杂度,提高系统扩展性,但要注意事件循环依赖的问题。框架
组成部分:分布式
处理saga调用请求接收,分析及执行和结果查询等内容。微服务
执行模块根据调用图谱生成调用任务,调用微服务处理模块相关接口,若是执行出错采起补偿方法。线程
经过分析请求的json数据,构建调用关系图谱,json用来描述saga事务串型调用子事务并执行子事务。