一. 什么是分布式事务

在分布式架构中,一次业务调用,可能横跨多个服务和多个数据库,传统的数据事务无法保证数据的一致性,需要通过分布式事务来解决

二. 分布式事务基础理论

1. CAP定理

  • C 一致性
  • A 可用性
  • P 分区容错性

分布式架构中P一定存在,三者只能满足其二,所以架构要么是AP 可用性, 要么是CP 一致性

2. BASE理论

  • BA 核心服务基本可用
  • S 可能会出现数据的不一致(软状态)
  • E 最终达成一致性

    三. 分布式事务的解决方案

  • XA

    • 基于XA接口的两阶段提交方案
  • AT
    • 改良版的两阶段提交方案
  • TCC
    • try confirm cancel
  • SAGA
    • 长事务解决方案 confirm cancel
  • MQ + 本地消息表

    • 将一个大的事务,拆分成若干小的环节,通过可靠性的消息来保证全部执行

      四. Spring Cloud Alibaba Seata

      alibaba提供的一套开源框架, 提供了分布式事务的一站式解决方案 支持XA AT TCC SAGA

  • XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入

  • TCC模式:最终一致的分阶段事务模式,有业务侵入
  • AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
  • SAGA模式:长事务模式,有业务侵入

image-20210724185021819.png

1. 如何使用seata

部署seata的服务端(TC 事务协调器)

  1. 修改配置: registry.conf
    • 注册中心
      • 让seata将自己的服务信息 注册到nacos中
    • 配置中心
      • 让seata从nacos中 拉取配置
  2. 配置事务数据库
    • 全局事务表
    • 分支事务表
    • 全局锁表

微服务整合seata

  1. 引入seata的依赖 1.4.2
  2. 修改微服务的配置 指定从nacos中拉取seata的服务端信息
  3. 在事务的发起方法中添加全局事务注解

    1. @GlobalTransactional

    3. seata的工作原理

    使用前提:

  4. 数据库必须是支持事务的关系型数据库

  5. 必须是java项目,并且用JDBC去访问数据库
    1. @GlobalTransactional
  • 标记的方法说明开启了全局事务,seata会为该方法准备一个拦截器
  • 当该方法被调用时,拦截器中 会向TC端 注册一个全局事务信息(xid)
  • 注册好全局事务后,开始执行每个分支事务:
    • 整理流程分为两个阶段

一. 执行每一个分支事务

  1. 1. seatadatasource创建了代理对象, 每个服务中操作数据库的方法执行时会创建分支事务
  2. - seata会先解析要执行的sql语句
  3. 1. 生成前置镜像
  4. 1. 执行SQL
  5. 1. 生成后置镜像,将镜像内容存入undolog日志中
  6. 1. 分支事务执行完毕

二.根据第一阶段结果,提交 或 回滚
如果所有的分支事务都执行成功,说明全局事务成功,异步的删除undolog日志即可

如果有任何一个环节失败,根据undolog日志进行事务回滚
回滚时:会判断当前数据内容和后置镜像是否一致,一直回滚
不一致, 就一直重试

五, seata脏读/脏写问题

脏读

  • 默认情况下会出现脏读
    • 每个分支事务都提交了数据库的事务
  • 如果不想出现脏读,可以再select语句后加上for update

    • seata重写了语法解析,会通过判断全局锁的方式,将隔离级别提升为 读已提交
    • 性能不好

      脏写

  • 不会出现脏写问题

  • 虽然会出现脏读问题,但如果另一个事务拿到脏数据想修改,还是需要获取全局锁才可以

    六. seata能否保证高可用

    可以通过搭建集群来解决