微服务——分布式事务

26人浏览

1 什么是分布式事务

分布式事务,简单来说就是,一个大的操作由多个小操作共同完成,这些小操作分布在不同的网络主机,要么全部成功执行,要么全部不执行。业务分布在不同的数据库实例上,此时无法用数据库原生事务来保证数据一致性。

2 事务有ACID四个特征

  • 原子性(Atomicity):事务要么全部做,要么全部不做。
  • 一致性(Consistency):事务在执行之前和执行之后,数据库都必须处于一致性状态。
  • 隔离性(Isolation):事务之间不能相互干扰。
  • 持久性(Durability):一旦事务完成,对于数据的变更是永久的。

3 SQL标准定义了4类隔离级别

  1. 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据;
  2. 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读);
  3. 可重复读(Repeated Read):在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别;
  4. 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

4 基础理论

CAP原则

  • 一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)的缩写。
  • CAP 原则是这三个要素最多只能同时实现两点,不可能三者兼顾

BASE理论

  • 基本可用 (Basically Available),软状态(Soft State),最终一致性(Eventually Consistent)的缩写。
  • BASE理论是对CAP中的一致性和可用性进行一个权衡的结果,核心思想是:无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。满足BASE理论的事务,称之为柔性事务。

5 分布式事务实现方案

5.1 XA

成熟的关系数据库都会支持XA事务,使用二阶段提交保证事务一致性。JTA(Java Transaction API)  是Java实现XA事务的一个规范。使用JTA容器实现事务,可以跨越多数据源的事务。

优点:强一致性,同步执行,算法简单易实现,可用于微服务。

缺点:二次提交,事务时间长,性能比较低,存在单点故障数据不一致问题。

5.2 TCC

TCC:是Try、Confirm 和 Cancel三个单词首字母缩写,补偿事务,是一种在业务端实施业务逆向操作事务。

优点:吞吐量高。

缺点:增加了代码复杂性。

5.3 事务消息

通过消息方式异步执行事务,再通过业务规则进行失败重试,实现最终一致性。

优点:异步执行,无同步阻塞和单点故障问题,性能高,吞吐量高。

缺点:算法复杂度高。

5.4 SAGA

Saga的原理,是将一个长的分布式事务,拆分成独立的小的事务,通过异步的事务补偿机制,达到最终一致性。

优点:集中分布式事务的编排,避免服务之间的循环依赖关系。

缺点:相比TCC缺少预提交动作,导致补偿动作的实现比较麻烦,事务较适用于补偿动作容易处理的场景。

 

处理分布式事务的原则:业务规避 > 最终一致 > 强一致。