SpringCloud-高级篇(五)

一:分布式事务理论基础

SpringCloud-高级篇(五)_第1张图片

SpringCloud-高级篇(五)_第2张图片

原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
————————————————

在原来学的单体架构项目中,往往只有一个服务,这个服务只访问一个数据库,业务比较简单,基于数据库本身的特性,能够实现ACID,我们现在要研究微服务,微服务的业务比较复杂,可能一个业务需要跨越多个服务,每个服务要有自己的数据库,这个时候考数据库本身的特性不能保证整个业务的ACID

SpringCloud-高级篇(五)_第3张图片

SpringCloud-高级篇(五)_第4张图片

SpringCloud-高级篇(五)_第5张图片

SpringCloud-高级篇(五)_第6张图片

SpringCloud-高级篇(五)_第7张图片

SpringCloud-高级篇(五)_第8张图片

SpringCloud-高级篇(五)_第9张图片

订单模块:

SpringCloud-高级篇(五)_第10张图片

SpringCloud-高级篇(五)_第11张图片

OrderService:

SpringCloud-高级篇(五)_第12张图片

SpringCloud-高级篇(五)_第13张图片

远程调用的客户端:

SpringCloud-高级篇(五)_第14张图片

数量模块: 

SpringCloud-高级篇(五)_第15张图片

SpringCloud-高级篇(五)_第16张图片

 客户端:

SpringCloud-高级篇(五)_第17张图片

库存模块:

SpringCloud-高级篇(五)_第18张图片

SpringCloud-高级篇(五)_第19张图片

SpringCloud-高级篇(五)_第20张图片

使用Postman发送订单请求:

SpringCloud-高级篇(五)_第21张图片

SpringCloud-高级篇(五)_第22张图片

订单表刷新一下:

SpringCloud-高级篇(五)_第23张图片

余额由1000变成800:

SpringCloud-高级篇(五)_第24张图片

库存表变成由10变8:

SpringCloud-高级篇(五)_第25张图片

更改订单数量:变大订单购买数量超过余额导致失败:SpringCloud-高级篇(五)_第26张图片

此时用户的余额不应该扣除,但是扣减了

SpringCloud-高级篇(五)_第27张图片

此时的状态不是一致的

SpringCloud-高级篇(五)_第28张图片

理论上库存服务报错,前面也应该跟着回滚,但是没有,因为每个服务都是独立的,库存服务抛了异常,账户服务不知道,第二每个服务都是独立的,他们的事务也是独立的,订单服务,账户服务执行完业务之后事务结束了执行提交了,没有办法回滚,最终没有达成事务状态的一致,这个时候就出现了分布式事务的问题

SpringCloud-高级篇(五)_第29张图片

SpringCloud-高级篇(五)_第30张图片

SpringCloud-高级篇(五)_第31张图片

解决分布式事务的理论基础

SpringCloud-高级篇(五)_第32张图片

1.CAP定理 

SpringCloud-高级篇(五)_第33张图片

SpringCloud-高级篇(五)_第34张图片

SpringCloud-高级篇(五)_第35张图片

为了满足一致性可以让node03等待node02网络的恢复和数据同步,在恢复之前,所有访问的请求都阻塞下去,这么做就可以满足数据的一致性,此时node03就变成不可用的了

为了满足可用性,就没有办法保持一致性

当网络分区出现时,可用性跟一致性没有办法同时满足

分区是不可避免的,只要你是分布式系统节点之间都是通过网络连接的,只要通过网络连接的,就没有办法永远保持永远健康

我们可以这么认为分布式系统分区一定会出现,整个集群不需要对外提供服务,P一定要实现,此时C和A之间只能要一个

 SpringCloud-高级篇(五)_第36张图片

2.BASE理论

P分区一定会出现,A可用跟C一致一定只能选一个,这两个特性都非常重要,都不想放弃那怎么办?BASE理论正好可以解决这个问题

SpringCloud-高级篇(五)_第37张图片

BASE理论是对CAP理论的调和跟选择和调和

我们分布式事务当中分为很多子事务,他们各自执行跟提交,有些成功,有些失败,这个时候状态不一致,我们希望分布式事务的子事务状态要一致,要么都成功,要么都失败,基于BASE理论去解决:

SpringCloud-高级篇(五)_第38张图片

各个子事务要去互相通信,去辨别对方的执行状态,各个子事务之间怎么去通信呢,需要一个协调者帮助子事务去通信,感知对方的状态

SpringCloud-高级篇(五)_第39张图片

SpringCloud-高级篇(五)_第40张图片

你可能感兴趣的:(spring,cloud,spring,后端)