本地事务
本地事务是解决单个数据源上的数据操作的一致性问题,具有 原子性、一致性、持久性、隔离性。
分布式事务
分布式事务则是为了解决跨越多个数据源上数据操作的一致性问题。分布式事务需要了解CAP理论和BASE理论
CAP理论
- 一致性(C:Consistency):一致性是指数据在多个副本之间能否保持一致的特性。例如一个数据在某个分区节点更新之后,在其他分区节点读出来的数据也是更新之后的数据;
- 可用性(A:Availability):可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。这里的重点是"有限时间内"和"返回结果";
- 分区容错性(P:Partition tolerance):分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务。
分布式环境下(数据分布)要任何时刻保证数据一致性是不可能的,只能采取妥协的方案来保证数据最终一致性。
选择 | 说明 |
---|---|
CA | 放弃分区容错性,加强一致性和可用性,其实就是传统单机数据库的选择 |
AP | 放弃一致性(这里指强一致性),追求可用性和分区容错性,例如hdfs,分布式数据库 |
CP | 放弃可用性,追求一致性和分区容错性,基本不会选择,因为网络会导致系统不可用 |
BASE理论
- Basically Available(基本可用):通过支持局部故障而不是系统全局故障来实现的。如将用户分区在 5 个数据库服务器上,一个用户数据库的故障只影响这台特定主机那 20% 的用户,其他用户不受影响;
- Soft State(软状态):状态可以有一段时间不同步;
- Eventually Consistent(最终一致):最终数据是一致的就可以了,而不是时时保持强一致。
分布式事务的几种解决方案
-
2PC(二阶段提交)方案,事务的提交分为两个阶段:准备阶段和提交执行方案。
-
3pc(三阶段提交)方案。
-
TCC(即Try、Confirm、Cancel),它采用了补偿机制,核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。
-
本地消息表,它的核心思想就是将分布式事务拆分成本地事务进行处理。
-
最大努力通知,实现最大努力通知,可以采用MQ的ack机制。
-
Saga事务,它的核心思想是将长事务拆分为多个本地短事务,由Saga事务协调器协调,如果正常结束那就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作。