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-hant/n/331988.html