分布式事务(刚性事务ACID与柔性事务BASE)

分布式事务的基本CAP理论:Consistency一致性(强一致)、Availability-可用性、Partition tolerance分区容错性,只能同时满足三个特性中的两个。

刚性事务

遵循ACID理论,强一致性。

ACID原则:Atomicity原子性、Consistency一致性、Isolation隔离线、Durability持久性。

  • 预写日志WAL(Write ahead logging)

现代数据库都使用这种方式,步骤如下:

  1. 先记录 undo/redo log(undo记录修改前的内容,redo记录修改后的内容),确保日志刷到磁盘上持久存储。
  2. 更新数据记录,缓存操作并异步刷盘
  3. 将事务SQL日志持久化到 binlog(binlog开启时)
  4. 提交事务,在 redo log 中写入 commit 记录
  • 影子分页(Shadow paging)

老技术,已数据页为单位进行进行记录

  • 两阶段型

两阶段提交,对应技术上的XA、JTA/JTS,这是分布式环境下事务处理的典型模式。

  • 步骤:
  1. 准备阶段:向所有数节点提交事物;各节点将写入undo/redo log并返回同意或终止结果。
  2. 提交阶段:准备阶段返回同意则想所有节点发送提交操作,返回终止则发送回滚操作。
  • 缺点:
  1. 同步堵塞:占用资源
  2. 单点故障:协调者为单点服务,出现故障时无法是继续执行中断的事物
  3. 数据不一致:协调者在提交阶段发送故障,部分发送提交,部分未发送提交时,会出现数据不一致情况。

柔性事务

遵循BASE理论,最终一致性。

BASE理论:Basically Available基本可用、Soft State柔性状态(中间状态)、Eventual Consistency最终一致性。

  • 补偿型

TCC型事务(Try/Confirm/Cancel)可以归为补偿型,目的是为了最快释放资源。

  1. Try:尝试执行各分布式事务,修改数据为中间状态,如转账记录,订单状态处理中,账户金额修改为可用金额80,冻结资金20.
  2. Confirm:所有try中执行都成功时,修改数据到成功状态,如订单状态成功,账户金额修改为可用金额80,冻结资金0,
  3. Cancel:当try中执行有一个失败时,修改数据到失败状态,如订单状态失败,账户金额修改为可用金额100,冻结资金0,
  • 异步确保型 

异步处理,将同步堵塞事物改为异步事物处理,一般使用MQ进行异步处理,为防止MQ丢失,可以使用补偿服务消息补偿。

  • 最大努力型 

重试处理,异步重试服务,执行分布式事务事物时,将失败的子事物发送给重试服务,重试服务进行事物重新提交到分布式服务器中处理。

你可能感兴趣的:(分布式)