Skip to content

1)分布式事务(Seata)

🐣 第 1 题(基础概念)

Q1:什么是分布式事务,Seata 是如何实现的?

📝 标准答案:

分布式事务 是指跨多个服务或数据库执行的事务。由于分布式系统中各个服务和数据库可能是独立的,传统的单体事务不再适用,因此需要通过一定的机制保证跨系统的数据一致性。

Seata 是一款开源的分布式事务解决方案,提供了全局事务管理事务协调事务补偿等功能。Seata 采用了 AT(自动提交模式)TCC(Try Confirm Cancel)SAGA(长事务) 三种事务模式,支持多种数据库和分布式架构。

Seata 的核心组成:

  • TC(Transaction Coordinator):事务协调器,负责全局事务的管理和协调。
  • TM(Transaction Manager):事务管理器,负责发起事务,并通过调用 TC 来提交或回滚事务。
  • RM(Resource Manager):资源管理器,管理各个资源(如数据库、消息队列)的事务操作。

🛠️ 第 2 题(Seata 配置与使用)

Q2:如何配置和使用 Seata 进行分布式事务管理?

📝 标准答案:

配置步骤:

  1. 引入 Seata 依赖:

在项目中引入 Seata 的相关依赖(例如使用 Maven):

xml
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.6.0</version>
</dependency>
  1. 配置 Seata 的服务器:

application.ymlapplication.properties 中配置 Seata 的 TC 和 RM:

yaml
seata:
  tx-service-group: my_test_tx_group # 配置事务组名
  service:
    vgroup-mapping.my_test_tx_group: default # 配置全局事务协调器
  store:
    mode: db # 存储模式(可以是 db, file 等)
    db:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/seata
        user: root
        password: root
  1. 配置资源管理器:

在 Spring 配置中,注册 DataSource 作为 Seata 的资源管理器:

java
@Bean
public DataSource dataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setUrl("jdbc:mysql://localhost:3306/demo");
    dataSource.setUsername("root");
    dataSource.setPassword("root");
    return new DataSourceProxy(dataSource);
}
  1. 启动 Seata 服务:

启动 Seata 的 Transaction Coordinator 服务,通常是独立部署的,配置数据库存储和 Nacos 等作为注册中心。

📦 第 3 题(事务模式)

Q3:Seata 支持哪些事务模式?请简单描述每种模式的特点。

📝 标准答案:

Seata 支持三种主要的事务模式:

  1. AT(Automatic Transaction,自动提交模式)

    • 默认的事务模式,适用于支持二阶段提交(2PC)协议的数据库。
    • 适用于简单的数据库操作,Seata 自动管理事务的提交和回滚。
    • 不需要开发者额外编写事务逻辑,使用方便,但灵活性较低。
  2. TCC(Try Confirm Cancel)

    • 适用于分布式事务的复杂场景,采用三阶段提交(3PC)协议。
    • Try 阶段预留资源,Confirm 阶段确认资源,Cancel 阶段回滚资源。
    • 适用于一些具有明确确认和取消操作的场景(如支付、库存等业务场景)。
  3. SAGA(Long Transaction,长事务模式)

    • 适用于需要跨多个系统进行多步骤操作的场景。
    • 每一步操作都提交一个本地事务,并且每个本地事务都有一个补偿操作。
    • 适用于长时间的业务流程,通常在微服务中使用。

⚙️ 第 4 题(事务隔离级别与补偿机制)

Q4:Seata 的事务隔离级别是什么?如何处理事务的补偿机制?

📝 标准答案:

事务隔离级别:

Seata 使用数据库的事务隔离级别,通常支持以下几种:

  • READ_UNCOMMITTED(读未提交)
  • READ_COMMITTED(读已提交)
  • REPEATABLE_READ(可重复读)
  • SERIALIZABLE(可串行化)

Seata 在执行分布式事务时,默认使用数据库的事务隔离级别来保证数据的一致性。可以在 Seata 配置中自定义事务的隔离级别。

补偿机制:

Seata 通过 TCCSAGA 模式实现事务的补偿机制:

  1. TCC 补偿:

    • 在事务的 Try 阶段如果失败,Seata 会通过 Cancel 阶段进行回滚。
    • Confirm 阶段确认成功后,不再进行回滚操作。
  2. SAGA 补偿:

    • 每个本地事务都有一个补偿操作(Compensate)。
    • 如果某个本地事务失败,会触发其对应的补偿操作,逆向回滚已提交的事务。

补偿操作示例:

java
public void confirm() {
    // 确认操作
}

public void cancel() {
    // 补偿操作
}

🚀 第 5 题(性能与扩展)

Q5:Seata 在高并发场景下的性能如何?如何优化 Seata 性能?

📝 标准答案:

Seata 性能考虑:

在高并发场景下,Seata 的性能会受到以下因素的影响:

  • 事务协调器的负载:Seata 的事务协调器(TC)会处理所有全局事务的提交与回滚,过多的全局事务会导致 TC 负载过高。
  • 资源管理器的性能:Seata 通过资源管理器(RM)与数据库进行交互,频繁的数据库操作可能会成为瓶颈。

性能优化:

  1. 优化事务粒度: 减少全局事务的粒度,将多个操作合并为一个事务,避免过多小事务。
  2. 增加事务协调器实例: 部署多个 TC 实例来分担事务协调的负载。
  3. 优化数据库操作: 确保数据库查询和更新的高效性,避免锁争用和性能瓶颈。
  4. 异步提交事务: 使用异步提交事务,减轻同步事务提交的压力。
  5. 优化补偿操作: 确保补偿操作高效执行,避免冗长的补偿逻辑影响性能。

📎 进阶建议

若想进一步提升 Seata 的应用,推荐了解以下内容:

  • Seata 高级配置:探索 Seata 的高可用性配置、事务调度策略等。
  • Seata 与容器化部署:如何将 Seata 部署到 Kubernetes 等容器化环境中,处理大规模分布式事务。
  • Seata 的事务日志与监控:配置 Seata 的事务日志、事务链路跟踪与监控,保障事务执行过程的可视化和透明化。