Seata 全局事務(wù)管理:如何配置和使用 Seata 的事務(wù)管理功能?
Seata 是一個開源的分布式事務(wù)解決方案,旨在為微服務(wù)架構(gòu)中的分布式事務(wù)提供統(tǒng)一的事務(wù)管理功能。它通過全局事務(wù)和分支事務(wù)的概念,解決了跨服務(wù)和跨數(shù)據(jù)庫的一致性問題。接下來我們將深入探討如何配置和使用 Seata 的事務(wù)管理功能,重點介紹全局事務(wù) ID、分支事務(wù)、事務(wù)狀態(tài)等核心概念,并通過多個代碼示例展示如何在 Spring Boot 和 Spring Cloud 中使用 Seata。
1、核心概念
在 Seata 中,分布式事務(wù)被分為兩大類:
1、全局事務(wù)(Global Transaction) 全局事務(wù)是一個跨多個微服務(wù)或系統(tǒng)的事務(wù),它由一個全局事務(wù) ID 唯一標識。全局事務(wù)可以包括多個分支事務(wù),它的目標是確保多個分支事務(wù)在最終提交或回滾時保持一致性。
2、分支事務(wù)(Branch Transaction) 分支事務(wù)是全局事務(wù)的一部分,通常對應(yīng)于具體的操作,如調(diào)用遠程服務(wù)、訪問數(shù)據(jù)庫等。分支事務(wù)通常是短時間的,并由具體的資源管理器(如數(shù)據(jù)庫或消息隊列)負責(zé)處理。
3、事務(wù)狀態(tài)(Transaction Status) Seata 中的事務(wù)狀態(tài)包括:
- Begin:事務(wù)開始
- Commit:事務(wù)提交
- Rollback:事務(wù)回滾
4、Seata 的角色
- TC(Transaction Coordinator):負責(zé)全局事務(wù)的協(xié)調(diào)
- RM(Resource Manager):管理和操作分支事務(wù),通常是數(shù)據(jù)庫、消息隊列等
- TM(Transaction Manager):負責(zé)發(fā)起全局事務(wù),通常集成在服務(wù)代碼中
2、如何配置 Seata 和使用全局事務(wù)
2.1、添加 Seata 依賴
在 Spring Boot 項目中,可以通過以下 Maven 依賴來引入 Seata 相關(guān)依賴:
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.6.1</version>
</dependency>
2.2、Seata 配置
Seata 需要一個配置中心來存儲全局事務(wù)的狀態(tài)。最常見的配置是通過 Nacos 或 Zookeeper 實現(xiàn)。下面是一個典型的 application.yml
配置示例:
server:
port: 8080
spring:
application:
name: seata-demo
seata:
tx-service-group: my_test_tx_group # 設(shè)置全局事務(wù)組名
config:
type: nacos
nacos:
server-addr: localhost:8848
namespace: public
group: SEATA_GROUP
transport:
type: TCP
server: 127.0.0.1:8091
2.3、配置 Seata 服務(wù)端
Seata 服務(wù)端需要配置數(shù)據(jù)庫或其他存儲系統(tǒng)來管理事務(wù)。以 Nacos 為例,配置項如下:
transport:
type: TCP
server: 127.0.0.1:8091
store:
mode: db
db:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/seata
user: root
password: root
2.4、啟用 Seata 全局事務(wù)
在 Spring Boot 中,你可以使用 @GlobalTransactional
注解來啟用全局事務(wù)。例如,下面的代碼展示了一個簡單的全局事務(wù)管理:
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
@GlobalTransactional
public void createOrder() {
// 模擬創(chuàng)建訂單操作
System.out.println("Order Created");
}
}
3、使用 Seata API 提交、回滾事務(wù)
Seata 提供了多種 API 來操作全局事務(wù),例如提交事務(wù)、回滾事務(wù)等。以下是如何使用 Seata API 來管理事務(wù)。
3.1、事務(wù)開始
當你調(diào)用 @GlobalTransactional
注解的服務(wù)時,Seata 會自動啟動全局事務(wù)并生成一個全局事務(wù) ID。在代碼中,你不需要手動創(chuàng)建事務(wù),Seata 會自動管理它。
3.2、提交事務(wù)
如果所有的分支事務(wù)都成功執(zhí)行,Seata 會嘗試提交全局事務(wù)。你可以通過調(diào)用 GlobalTransactionContext
來手動提交事務(wù)。
import io.seata.core.context.GlobalTransactionContext;
import io.seata.tm.api.GlobalTransaction;
public class OrderService {
public void commitTransaction() {
GlobalTransaction globalTransaction = GlobalTransactionContext.getCurrentOrCreate();
globalTransaction.commit();
}
}
3.3、回滾事務(wù)
如果出現(xiàn)任何錯誤,或者你需要回滾整個事務(wù),可以調(diào)用 GlobalTransactionContext
提供的 rollback()
方法來回滾全局事務(wù)。
public void rollbackTransaction() {
GlobalTransaction globalTransaction = GlobalTransactionContext.getCurrentOrCreate();
globalTransaction.rollback();
}
4、分支事務(wù)的處理
4.1、分支事務(wù)的注冊
在 Seata 中,分支事務(wù)是由 Resource Manager (RM) 進行管理的。一個分支事務(wù)通常會在服務(wù)調(diào)用或數(shù)據(jù)庫操作之前進行注冊。你可以通過 Seata 提供的 API 注冊分支事務(wù)。
假設(shè)我們在做一個訂單和支付的操作,訂單服務(wù)和支付服務(wù)是兩個分支事務(wù)。
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
@Autowired
private DataSourceProxy dataSource;
public void createOrderAndPay() {
// 先創(chuàng)建訂單
createOrder();
// 然后支付
makePayment();
}
private void createOrder() {
// 訂單創(chuàng)建邏輯
System.out.println("Creating Order");
}
private void makePayment() {
// 支付邏輯
System.out.println("Making Payment");
}
}
4.2、分支事務(wù)的提交和回滾
分支事務(wù)的提交和回滾通常是由 RM
管理器根據(jù)全局事務(wù)的狀態(tài)進行的。如果所有分支事務(wù)都成功,Seata 會提交這些事務(wù);如果某個分支事務(wù)失敗,Seata 會回滾所有相關(guān)事務(wù)。
5、Seata 和 Spring Cloud 整合
如果你在使用 Spring Cloud 微服務(wù)框架,Seata 提供了與 Spring Cloud 的集成支持。以下是如何配置 Spring Cloud 和 Seata。
5.1、Spring Cloud 集成 Seata
首先,在 Spring Cloud 的 application.yml
中添加 Seata 的配置:
seata:
tx-service-group: my_test_tx_group
config:
type: nacos
nacos:
server-addr: localhost:8848
namespace: public
group: SEATA_GROUP
transport:
type: TCP
server: 127.0.0.1:8091
然后,像 Spring Boot 一樣,通過 @GlobalTransactional
注解來啟動全局事務(wù)。
5.2、跨服務(wù)的全局事務(wù)管理
在微服務(wù)架構(gòu)中,你可能會有多個服務(wù)進行分布式事務(wù)的管理。例如,訂單服務(wù)和支付服務(wù)的事務(wù)可以通過 Seata 進行跨服務(wù)的全局事務(wù)管理。你只需要確保每個微服務(wù)都啟用了 Seata 并配置了正確的事務(wù)組名。
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@Autowired
private PaymentService paymentService;
@GlobalTransactional
@RequestMapping("/createOrder")
public String createOrder() {
// 創(chuàng)建訂單并支付
orderService.createOrder();
paymentService.makePayment();
return "Order Created and Payment Made";
}
}
6、總結(jié)
Seata 作為一個分布式事務(wù)管理工具,為微服務(wù)架構(gòu)提供了一種高效、簡單的事務(wù)管理解決方案。通過配置 Seata 的全局事務(wù)和分支事務(wù),并結(jié)合 Spring Boot 或 Spring Cloud,可以幫助開發(fā)人員輕松管理跨服務(wù)和跨數(shù)據(jù)庫的事務(wù)一致性。
關(guān)鍵點回顧:
- 全局事務(wù) 和 分支事務(wù) 是 Seata 事務(wù)模型的核心。
- @GlobalTransactional 注解可以自動啟動全局事務(wù)。
- 事務(wù)的提交和回滾通過 Seata API 進行管理。
- Seata 可以與 Spring Boot 和 Spring Cloud 平臺進行無縫集成。
通過本文的示例代碼,你可以在實際項目中輕松實現(xiàn) Seata 的分布式事務(wù)管理,并確保多個微服務(wù)之間的事務(wù)一致性。