您的位置:

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,用户可以大大降低系统运维成本,提高系统的可靠性和稳定性。