什么是事务

多个步骤操作,如果其中有一个失败,就需要回滚之前成功的操作,要么全部成功要么全部失败。


事务的四大特征 ACID

Atomic原子性

事务是一个不可分割的单元,所有操作要么全部成功,要么全部失败回滚。

Consistent一致性

一致性基于原子性,即使全部成功,执行程序内需要时间 在这段时间内,实际上有三个步骤 开始->执行过程->结束。一致性保证只有开始和结束两个状态没有中间过程。

Isolated隔离性

每个事务都需要原子性和一致性,隔离性就保证了多个事务之间互不影响。

Durable持久性

只要提交了就会发生改变,结果持久化保存,结果不会丢失。

为什么需要事务

目的是保证数据的高可靠性,事务是数据库提供的标准。
所以事务是为了保证数据可靠。那么不用事务能不能保证数据可靠?或者说数据库不支持了该怎么办?


分布式事务的由来

事务是数据库提供的,目前数据库只支持单库事务。而微服务架构的大型业务需要一系列子模块子业务,每个模块都有自己的数据库。所以出现分布式系统数据不可靠的问题。
从单体项目到分布式项目产生的问题

为什么要用分布式系统

  1. 提升系统性能,单一服务无法承载系统业务量,需要多节点提供相同服务。
  2. 增加系统容错,某一台或者某几台服务down掉不影响整体功能,提高可用性。

提高服务可靠性

分布式系统的CAP理论

在一个分布式系统中,下面三条最多选两个

  1. Consistency 一致性 同一数据的多个副本是否实时相同。
  2. Availability 可用性:一定时间内系统返回一个明确的结果 则称为该系统可用。
  3. Partition tolerance 分区容错性 即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。

1. C-P 一致性 分区容错

相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。

反应慢==不好用

2. C-A 一致性 可用性

不需要 P(Partition tolerance分区容错性) 就是不要分布式,单机事务完全ok。

单机==性能瓶颈,容错低

3. A-P 可用性 分区容错

高可用,高容错,但是数据可能不一致。

不一致 有时候影响不大。


分布式系统设计平衡

到这就能看出 分布式系统就是解决C-A带来的问题 但又带来了新的问题C-P和A-P。所以必须强一致的地方就必须容忍性能差反应慢。影响不大的地方可以不完全一致提高效率。总结就是分布式系统设计需要在 响应慢、结果正确响应快、数据不准之间疯狂反复横跳。

BASE理论

  1. BA (Basic Available 基本可用) 只满足 在一定时间内返回正确结果的一个方面。

    1. 反应时间加长

    2. 给一个缓冲页面。

  2. S (Soft State软状态) 不要求完全一致 比如说缓冲页面可以不是实时数据。

  3. E (Eventual Consisstency最终一致性) 最终一定要一致,比如缓冲页面数据定时更新。


分布式事务问题的思路

分布式事务的问题实际上就是解决数据一致性的问题,只有两种思路,强一致性和弱一致性。

2PC (Two-phase Commit)协议

  1. 该分布式系统中,存在一个节点作为协调者(Coordinator),其他节点作为参与者(Cohorts)。且节点之间可以进行网络通信。
  2. 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上,即使节点损坏不会导致日志数据的消失。
  3. 所有节点不会永久性损坏,即使损坏后仍然可以恢复。

  1. 这个流程从上到下都是阻塞操作的 每一步都需要等上一步成功才能执行。
  2. 参与者、协调者如果发生故障只能通过超时方式得知,而且超时就是失败 需全部回滚。

3PC (Three-phase commit)协议

对2PC的改进,提前确认了所有服务器都可用,能减小一部分异常开销

TCC(Try Confirm Cancel)分布式补偿事务

  1. try 尝试待执行业务,检查一致性,预留资源,做好执行准备。
  2. confirm 执行业务。
  3. cancel 取消业务 回滚到执行之前。

本地消息表

  1. 核心是把分布式事务转换成单服务事,但是如果消息表失败,正常业务也会回滚。
  2. 但是需要新建消息表,对业务系统影响较大。
  3. 如发生以外情况会不断重试不断确认,性能损耗严重。

MQ事务 基于可靠消息中间件

核心思想是认为第三方消息中间件绝对可靠。本质是对消息表进行封装,把消息表移到中间件内部。