java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Seata基本使用及二阶提交流程

关于Seata基本使用及二阶提交流程

作者:Xwzzz_

这篇文章主要介绍了关于Seata基本使用及二阶提交流程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一,Seata 的基本使用

环境搭建

引入依赖

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.6.1</version> <!-- 根据需要选择最新版本 -->
</dependency>

配置 Seata

seata:
  tx-service-group: my_test_tx_group  # 事务分组
  service:
    vgroup-mapping:
      my_test_tx_group: default
    enable-auto-data-source-proxy: true  # 自动代理数据源
  registry:
    type: nacos  # 注册中心类型
    nacos:
      server-addr: 127.0.0.1:8848  # Nacos 地址
      namespace: public
      group: SEATA_GROUP
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      namespace: public
      group: SEATA_GROUP

在全局事务中使用 @GlobalTransactional

import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class OrderService {

    @Autowired
    private StockService stockService;

    @Autowired
    private PaymentService paymentService;

    @GlobalTransactional(name = "order-create", rollbackFor = Exception.class)
    public void createOrder(String userId, String productId, int amount) {
        // 扣减库存
        stockService.deductStock(productId, amount);

        // 处理支付
        paymentService.processPayment(userId, amount);

        // 插入订单记录
        System.out.println("订单创建成功!");
    }
}

在分支事务中使用 @Transactional

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class StockService {

    @Transactional
    public void deductStock(String productId, int amount) {
        // 执行数据库库存扣减操作
        System.out.println("库存扣减成功!");
    }
}

虽然 StockService 仍然使用的是本地事务 @Transactional,但因@GlobalTransactional 处于全局事务上下文中,Seata 会自动代理并管理它的事务

二,Seata 的工作原理

Seata 通过引入 全局事务管理分支事务 来解决分布式系统中的事务一致性问题。

它使用类似于传统数据库事务中的 二阶段提交(2PC,Two-Phase Commit) 协议来确保事务的原子性。

二阶段提交(2PC)过程

Seata 采用二阶段提交协议(2PC)来确保分布式事务的一致性。以下是二阶段提交的详细流程:

1. 第一阶段:事务预备(Try阶段)

// 启动全局事务
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
tx.begin();

2. 第二阶段:提交(Commit)或回滚(Rollback)

提交(Commit)

回滚(Rollback)

三,Seata 的四种事务模式

1. AT 模式(自动事务模式)

AT(Auto Transaction)模式是 Seata 中最常用的分布式事务模式,适用于对数据库执行常规的 CRUD(增、删、改、查)操作的场景,尤其是简单的 SQL 操作。

特点

工作原理

适用场景

2. TCC 模式(Try-Confirm-Cancel)

TCC(Try-Confirm-Cancel)模式是一种基于补偿的分布式事务模式,它适用于业务操作较为复杂、涉及多个服务的场景。与 AT 模式的自动提交和回滚不同,TCC 模式要求开发者显式地实现 TryConfirmCancel 这三个阶段。

特点

工作原理

适用场景

3. SAGA 模式

SAGA(长事务模式)是一个分布式事务处理模式,适用于跨多个微服务的长事务。与 TCC 模式不同,SAGA 模式通过将长事务拆分成多个小事务来保证一致性,每个小事务都会有一个补偿事务(Compensating Transaction),用于回滚操作。

特点

工作原理

适用场景

4. XA 模式(原生分布式事务)

XA 模式是传统的分布式事务协议,它基于 XA协议,是一种强一致性的分布式事务模式。Seata 的 XA 模式要求参与者支持 XA 事务协议,例如数据库、消息队列等。

特点

工作原理

适用场景

总结

Seata 支持以下四种分布式事务模式:

  1. AT 模式:适用于标准的数据库操作,自动管理事务,适合不涉及复杂业务逻辑的场景。
  2. TCC 模式:适用于跨多个服务的复杂业务,需要手动编写补偿逻辑。
  3. SAGA 模式:适用于长事务,适合拆分为多个子事务的场景,每个子事务都可以独立回滚。
  4. XA 模式:严格一致性的分布式事务协议,适用于需要强一致性的场景,如金融交易等。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文