0%

【SpringCloudAlibaba】Seata-分布式事务

分布式事务基础:(1)CAP定理(2)BASE理论(3)常见处理方案
Seate实现分布式事务


1 分布式事务基础

1.1 CAP定理

  • 一致性(Consistency):
    • 在分布式系统中所有数据备份,在同一时刻是否同样的值
  • 可用性(Availability):
    • 在集群中一部分节点故障后,集群整体是否还能影响客户端的读写请求
  • 分区容错性(Parition tolerance)
    • 大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区。分区同错的意思是,区间通信可能失败。
  • 注意:CAP定义,这三个要素最多只能同时实现两点,不可能三者兼顾

1.2 BASE理论

  • 基本可用(Basically Available):
    • 指分布式系统在出现故障时,允许损失部分可用性(例如响应时间,部分功能的可用)。基本可用 != 系统不可用
  • 软状态(Soft State)
    • 指允许系统存在中间状态,中间状态不会影响系统整体的可用性。(分布式存储中,一般一份数据会有多个副本,允许不同副本同步的延时)
  • 最终一致性(Eventual Consistency)
    • 指系统中所有数据副本经过一定时间后,最终能够达到一致的状态。

1.3 常见分布式事务方案

1.3.1 2PC
  • 2PC(2 phase commit)
    • 二阶提交,又名XA Transactions
    • 第一阶段:sql执行完,等待提交。事务管理器询问准备好提交没?资源管理器回复就绪进入二阶段
    • 第二阶段:事务要求资源管理提交事务,事务提交成功后回应已提交。否则就全部回滚。

1.3.2 TCC
  • TCC(Try Commit Cancel):
    • Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作既回滚操作。
    • TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。

1.3.3 最大努力通知
  • 发起方通知方通过一定的机制最大努力将业务处理结果通知到接收方
  • 某个业务出现异常,并不是进行数据回滚。而是通过再次发送消息,让其再进行处理,直到其能够成功处理为止
  • 注意:前提是保证代码无任何逻辑问题,业务处理异常是网络波动问题,非业务逻辑问题

1.3.4 可靠消息+最终一致性
  • 指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致。

2 Seata实现分布式事务

2.1 环境准备

  • (1)依赖

    1
    2
    3
    4
    5
    <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-seata -->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    </dependency>
  • (2)准备undo_log

  • 表内容可能会发生变化,以官方文档为准【文档

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE `undo_log` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `branch_id` bigint(20) NOT NULL,
    `xid` varchar(100) NOT NULL,
    `context` varchar(128) NOT NULL,
    `rollback_info` longblob NOT NULL,
    `log_status` int(11) NOT NULL,
    `log_created` datetime NOT NULL,
    `log_modified` datetime NOT NULL,
    `ext` varchar(100) DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  • (3)下载Seata并配置

  • 下载地址:【Github下载

  • 具体配置看网络教程(摸了)


2.2 使用

  • 在需要使用分布式事务的方法上添加@GlobalTransactional即可。默认使用AT(Auto Transactional)模式。
  • 更多自定义,请查看官方文档【文档】,但比较的旧