Seata AT 基本介紹

Seata AT(Seata Autonomous Transaction) 是一款開源的分散式事務解決方案,旨在解決分散式系統中事務一致性的問題。它提供了簡單易用的 API 和完整的管理控制台,支持各種分散式環境下的事務處理。

一、Seata AT 的基本原理

Seata AT 的基本原理是通過在分散式環境中引入兩階段提交協議(Transaction Commit Protocol) 來保證事務的一致性。具體流程如下:

1) 事務發起方向 Seata Server 發起一個全局事務創建請求(GTM),創建一個全局事務 ID。

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-all</artifactId>
    <version>1.4.2</version>
</dependency>

2) Seata Server 根據全局事務 ID 在相關的 Server 上創建分支事務(branch transaction), 用於處理服務本地事務的提交和回滾。

public interface TransactionService {

    /**
     * Global begin, return a global transaction Id.
     *
     * @param groupId         tx group id
     * @param transactionName tx business
     * @param timeout         timeout in MILLISECONDS
     * @return XID global transaction id
     * @throws TransactionException transaction exception
     */
    String begin(String groupId, String transactionName, int timeout) throws TransactionException;}

}

TransactionService transactionService = new DefaultTransactionServiceImpl();

String xid = transactionService.begin("my_test_tx_group", "", 3000);

3) 分散式系統中的其他 Server 接收到請求後,在本地運行事務,並記錄分支事務與全局事務的關聯關係。

4) 全局事務發起方維護全局事務狀態,根據各個分支事務的提交和回滾狀態來判斷是否提交全局事務。

二、Seata AT 的主要特點

Seata AT 擁有以下主要特點:

1) 分散式事務可嵌入到任意的應用系統中,並且不改變應用系統的代碼和數據源配置。

2) 提供了完整的事件監聽和分散式鎖機制,保證分散式事務的可靠處理。

3) 支持多種場景下的事務處理,包括分散式資料庫事務、跨 MQ 的事務、RPC 事務等。

三、Seata AT 的應用場景

Seata AT 在以下場景下是很有用的:

1) 具有高並發讀寫操作的分散式系統,如電商、金融交易等。

2) 多方參與的分散式系統,如多個用戶同時協作完成任務。

3) 多個系統之間需要保證數據一致性的分散式系統。

四、Seata AT 的使用指南

以下是一個簡單的 Seata AT 使用示例:

1) 創建資料庫庫表。在 StartSeataAT.sql 中包含了 SQL 創建腳本。

-- seata全局事務表,務必按照庫文件中的欄位
-- 注意:transaction_id 是一個非常關鍵的欄位,要使用上下文環境獲取,否則會導致沒法提交或回滾
 CREATE TABLE `seata_global_transaction` (
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `status` tinyint(4) NOT NULL,
  `application_id` varchar(32) NOT NULL,
  `transaction_service_group` varchar(32) NOT NULL,
  `transaction_name` varchar(128) NOT NULL,
  `timeout` int(11) NOT NULL,
  `transaction_type` tinyint(4) NOT NULL,
  `start_time` varchar(32) NOT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`transaction_id`),
  UNIQUE KEY `ux_seata_global_transaction_xid` (`xid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- seata分支事務表,務必按照庫文件中的欄位
-- 注意:xid,branch_id 和 resource_group_id 是關鍵欄位,要使用上下文環境獲取,否則會導致沒法提交或回滾
CREATE TABLE `seata_branch_transaction` (
  `branch_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `xid` varchar(128) NOT NULL,
  `resource_group_id` varchar(32) NOT NULL,
  `resource_id` varchar(256) NOT NULL,
  `branch_type` varchar(8) NOT NULL,
  `status` tinyint(4) NOT NULL,
  `client_id` varchar(64) NOT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`branch_id`),
  KEY `idx_xid` (`xid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2) 在 Apache Dubbo 中使用 Seata。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.6</version>
</dependency>

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-all</artifactId>
    <version>1.4.2</version>
</dependency>

<dubbo:reference id="xxxService" interface="com.xxx.XXXService" 
url="dubbo://localhost:20880"
check="false" timeout="5000">
    <dubbo:method name="xxxMethod" 
        oninvoke="seata.oninvoke(/com.xxx.XXXService/xxxMethod/1)"
        onreturn="seata.onreturn()" onthrow="seata.onthrow()" />
</dubbo:reference>

<bean id="seata" class="io.seata.rm.easyrpc.EasyRpcTCCLClientFilter"/>

3) 在 Spring Boot 中使用 Seata。

@Bean
public GlobalTransactionScanner globalTransactionScanner() {
    return new GlobalTransactionScanner("my_test_tx_group", "default");
}

@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
    return transactionManager(dataSource);
}

4) 使用 Seata 的分散式事務控制台。

https://github.com/seata/seata/releases 中下載最新版本。

五、Seata AT 的優缺點

優點:

1) 支持各種分散式環境下的事務處理,方便快捷。

2) 提供完整的管理控制台,可以查看分散式事務的狀態和操作記錄。

3) 擁有強大的事件監聽和分散式鎖機制,保證分散式事務的可靠處理。

缺點:

1) 需要引入第三方庫,系統接入難度較高。

2) 可能會因為分散式環境的複雜性而產生一些問題和難以解決的 Bug。

六、結語

Seata AT 為分散式系統中的事務處理提供了最佳解決方案,可以幫助用戶快速、高效地完成分散式事務控制。通過使用 Seata AT,用戶可以大大降低系統運維成本,提高系統的可靠性和穩定性。

原創文章,作者:FDJKT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/331988.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FDJKT的頭像FDJKT
上一篇 2025-01-20 14:10
下一篇 2025-01-20 14:10

相關推薦

  • at least one option must be selected

    問題解答:當我們需要用戶在一系列選項中選擇至少一項時,我們需要對用戶進行限制,即「at least one option must be selected」(至少選擇一項)。 一、…

    編程 2025-04-29
  • Python基本索引用法介紹

    Python基本索引是指通過下標來獲取列表、元組、字元串等數據類型中的元素。下面將從多個方面對Python基本索引進行詳細的闡述。 一、列表(List)的基本索引 列表是Pytho…

    編程 2025-04-29
  • Python基本數字類型

    本文將介紹Python中基本數字類型,包括整型、布爾型、浮點型、複數型,並提供相應的代碼示例以便讀者更好的理解。 一、整型 整型即整數類型,Python中的整型沒有大小限制,所以可…

    編程 2025-04-29
  • Python基本統計量計算

    本文將從多個方面詳細介紹Python中基本統計量計算的方法。 一、均值 均值是一組數據的平均值,也就是將所有數據相加後再除以數據個數。 在Python中,可以使用numpy庫中的m…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導著程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • Python三種基本輸入元素

    本文將從多個方面對於Python三種基本輸入元素進行詳細的闡述並給出代碼示例。 一、Python三種基本輸入元素解答 Python三種基本輸入元素包括命令行參數、標準輸入和文件輸入…

    編程 2025-04-28
  • Python基本操作:從入門到精通

    Python是一個功能強大的編程語言,有著簡單易學的語法和廣泛的用途。本篇文章將以Python基本操作為主要內容,從多個方面介紹Python的常用操作和技巧,幫助你快速學會Pyth…

    編程 2025-04-27
  • Seata GitHub詳解

    一、Seata簡介 Seata是一個基於Java的分散式事務管理解決方案,它通過一個全局事務ID來協調各個分支事務的執行結果,從而實現了分散式事務的一致性,同時保證了高性能的處理能…

    編程 2025-04-23
  • 中興C600基本命令詳解

    一、登錄 登錄命令為login,格式為:login {用戶名} {密碼} 例如:login admin 123456 若用戶名或密碼錯誤,則會提示錯誤信息 二、配置TELNET登錄…

    編程 2025-04-23
  • Python語言基本控制結構詳解

    Python是一種解釋型高級編程語言,具有易學、簡潔、靈活、可擴展等諸多特點。其基本控制結構包括條件語句、循環語句、函數和模塊,能夠幫助程序員實現複雜的邏輯、控制流和數據處理。本文…

    編程 2025-04-22

發表回復

登錄後才能評論