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