分布式事务解决方案
在扣减库存和保存订单是在两个服务中存在的,如果扣减了库存,但是保存订单失败时,事务没有回滚,这样就造成了数据不一致的情况,这就是分布式事务的问题。
事务
事务拥有四个特征:
-
原子型
一个事务要么同时成功,要么同时失败
-
一致性
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态
-
持久性
事务一旦提交了,就应该永久性的保存到数据库中
-
隔离性
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
-
脏读
脏读是指一个事务在处理的过程中读取了另一个未提交的事务
-
幻读
幻读是事务非独立执行时发生的一种现象。例如A用户把表中的某个字段数据的1修改为2,这时B用户进行了添加数据,字段仍然还是1,这时A用户看到的1数据就是幻读
-
不可重复读
B事务读取了两次数据,在这两次的读取过程中A事务修改了数据,B事务读取出来的两次数据不一样。B事务这种读取的结果即为不可重复读
-
本地事务和分布式事务
-
什么是本地事务?@Transactional
对单一的服务、单一的数据库生效称为本地事务
-
什么是分布式事务?
分布式事务保证这一个事务内部的多个服务中的功能要么都成功,要么都失败,从而保证不同数据库的一致性
分布式系统相关理论
CAP
分布式系统有三个指标:
-
Consistency 一致性
-
Availability 可用性
-
Partition tolerance 分区容错性
它们的第一个字母分别是:C、A、P,埃里克.布鲁尔说:这三个指标不可能同时满足(最多同时满足两个),这个结论就是CAP理论。
分区容错性 (Partition tolerance)
大多数分布式系统都分布在多个子网络,每一个子网络叫做一个区。分区容错性的意思是:区间通信有可能失败。比如,一台服务器在中国,一台服务器在美国,这就是两个区,它们之间有可能导致无法通信。
可用性 (Availability)
不管是哪台服务器,只要收到请求,都必须告诉用户,否则就不满足可用性。服务器越多,服务的可用性越好
一致性 (Consistency )
写操作之后的读操作,必须返回该值。服务器越少,服务的一致性越好
一致性和可用性的矛盾
在分布式系统下,C和A是不能进行组合的。那么组合就是CP、AP。
CP一般强调一致性,通常用于转账方面的服务,一般情况下我们都会选择可用性。
BASE理论
BASE:全称Basically Available(基本可用),Soft state(软状态),和Eventually consistent(最终一致性)三个短语的缩写,来自ebay的架构师提出。
BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大型互联网分布式实践的总结,是基于CAP定理逐步演化而来的。其核心思想是:即使做不到强一致性,但每个应用都可以根据自身业务的特点,采用适当的方式来使系统达到最终一致性
Basically Available(基本可用)
什么是基本可用?
假设系统出现了不可预知的故障,但还是能用,相比较正常系统而言:
- 响应速度上的损失:正常情况下的搜索引擎是0.5秒返回结果给用户,而基本可用的搜索引擎可用在1秒左右返回结果
- 功能上的损失:在一个电商网站上,正常情况下,用户可用顺利的完成每一笔订单,但是搞活动期间,我们需要损失一部分的用户来进行降级处理,保证大部分的用户能够正常访问