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 进行分布式事务管理?
📝 标准答案:
配置步骤:
- 引入 Seata 依赖:
在项目中引入 Seata 的相关依赖(例如使用 Maven):
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.6.0</version>
</dependency>
- 配置 Seata 的服务器:
在 application.yml
或 application.properties
中配置 Seata 的 TC 和 RM:
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
- 配置资源管理器:
在 Spring 配置中,注册 DataSource
作为 Seata 的资源管理器:
@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);
}
- 启动 Seata 服务:
启动 Seata 的 Transaction Coordinator
服务,通常是独立部署的,配置数据库存储和 Nacos 等作为注册中心。
📦 第 3 题(事务模式)
Q3:Seata 支持哪些事务模式?请简单描述每种模式的特点。
📝 标准答案:
Seata 支持三种主要的事务模式:
AT(Automatic Transaction,自动提交模式):
- 默认的事务模式,适用于支持二阶段提交(2PC)协议的数据库。
- 适用于简单的数据库操作,Seata 自动管理事务的提交和回滚。
- 不需要开发者额外编写事务逻辑,使用方便,但灵活性较低。
TCC(Try Confirm Cancel):
- 适用于分布式事务的复杂场景,采用三阶段提交(3PC)协议。
- Try 阶段预留资源,Confirm 阶段确认资源,Cancel 阶段回滚资源。
- 适用于一些具有明确确认和取消操作的场景(如支付、库存等业务场景)。
SAGA(Long Transaction,长事务模式):
- 适用于需要跨多个系统进行多步骤操作的场景。
- 每一步操作都提交一个本地事务,并且每个本地事务都有一个补偿操作。
- 适用于长时间的业务流程,通常在微服务中使用。
⚙️ 第 4 题(事务隔离级别与补偿机制)
Q4:Seata 的事务隔离级别是什么?如何处理事务的补偿机制?
📝 标准答案:
事务隔离级别:
Seata 使用数据库的事务隔离级别,通常支持以下几种:
- READ_UNCOMMITTED(读未提交)
- READ_COMMITTED(读已提交)
- REPEATABLE_READ(可重复读)
- SERIALIZABLE(可串行化)
Seata 在执行分布式事务时,默认使用数据库的事务隔离级别来保证数据的一致性。可以在 Seata 配置中自定义事务的隔离级别。
补偿机制:
Seata 通过 TCC
和 SAGA
模式实现事务的补偿机制:
TCC 补偿:
- 在事务的
Try
阶段如果失败,Seata 会通过Cancel
阶段进行回滚。 - 在
Confirm
阶段确认成功后,不再进行回滚操作。
- 在事务的
SAGA 补偿:
- 每个本地事务都有一个补偿操作(
Compensate
)。 - 如果某个本地事务失败,会触发其对应的补偿操作,逆向回滚已提交的事务。
- 每个本地事务都有一个补偿操作(
补偿操作示例:
public void confirm() {
// 确认操作
}
public void cancel() {
// 补偿操作
}
🚀 第 5 题(性能与扩展)
Q5:Seata 在高并发场景下的性能如何?如何优化 Seata 性能?
📝 标准答案:
Seata 性能考虑:
在高并发场景下,Seata 的性能会受到以下因素的影响:
- 事务协调器的负载:Seata 的事务协调器(TC)会处理所有全局事务的提交与回滚,过多的全局事务会导致 TC 负载过高。
- 资源管理器的性能:Seata 通过资源管理器(RM)与数据库进行交互,频繁的数据库操作可能会成为瓶颈。
性能优化:
- 优化事务粒度: 减少全局事务的粒度,将多个操作合并为一个事务,避免过多小事务。
- 增加事务协调器实例: 部署多个 TC 实例来分担事务协调的负载。
- 优化数据库操作: 确保数据库查询和更新的高效性,避免锁争用和性能瓶颈。
- 异步提交事务: 使用异步提交事务,减轻同步事务提交的压力。
- 优化补偿操作: 确保补偿操作高效执行,避免冗长的补偿逻辑影响性能。
📎 进阶建议
若想进一步提升 Seata 的应用,推荐了解以下内容:
- Seata 高级配置:探索 Seata 的高可用性配置、事务调度策略等。
- Seata 与容器化部署:如何将 Seata 部署到 Kubernetes 等容器化环境中,处理大规模分布式事务。
- Seata 的事务日志与监控:配置 Seata 的事务日志、事务链路跟踪与监控,保障事务执行过程的可视化和透明化。