AT 模式接入適用的場景包括跨數據庫事務、MQ 的消息事務、EDAS 的服務事務及多場景混合型事務方案。本文介紹如何基于 @TxcTransaction 注解使用
GTS 服務。
前提條件
在使用 AT 模式接入 GTS 前,請先完成以下工作:
條件和約束
AT 模式的原理要求全局事務涉及的數據庫系統、Schema 和 SQL 語句必須符合一定的規范。
配置應用代碼
通過審批的事務分組可以用于客戶的應用代碼中,需引入 GTS SDK 開發包,并添加依賴。
- 在 Spring 的配置文件中將申請好的事務分組名配置到
com.taobao.txc.client.aop.TxcTransactionScaner bean
中,并將阿里云賬號中的Access Key ID和Access Key Secret配置到 accessKey
和 secretKey
兩個屬性上。<bean class="com.taobao.txc.client.aop.TxcTransactionScaner">
<constructor-arg value="test111.1325460969176422.BJ"/>
<property name="accessKey" value="xxxx"/>
<property name="secretKey" value="xxxx"/>
</bean>
- 在需要啟動全局事務的方法前添加
@TxcTransaction(appName=“myapp”)
注解。其中
appName
的值為事務別名,可以在 GTS 控制臺上查詢。
@TxcTransaction(appName = "myapp")
public void hello() {
...
}
- 在 Spring 配置文件中聲明用到的含有 @TxcTransaction 注解的應用類,并使用這個 bean 的實例調用注解方法。
<bean id="bussiness" class="com.taobao.txc.tests.Bussiness" init-method="init">
</bean>
Bussiness bussiness = (Bussiness) context.getBean("bussiness");
//用實例化的bean調用GTS注解方法hello,使hello方法內的操作加入一個GTS事務
bussiness.hello();
- 如果使用的數據源是 MySQL、DRDS(5.3及以上版本,低于 5.3 版本請參見注意事項。)、Oracle、RDS、PostgreSQL ,需要配置為 GTS 的數據源。
<bean id="DataSource_rds" class="com.taobao.txc.datasource.cobar.TxcDataSource">
<property name="url" value="jdbc:mysql://xxxxx" />
<property name="username" value="xxx" />
<property name="password" value="xxx" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean>
- 在加入 GTS 事務的所有數據庫中建表 txc_undo_log。
CREATE TABLE `txc_undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`gmt_create` datetime NOT NULL COMMENT '創建時間',
`gmt_modified` datetime NOT NULL COMMENT '修改時間',
`xid` varchar(100) NOT NULL COMMENT '全局事務 ID',
`branch_id` bigint(20) NOT NULL COMMENT '分支事務 ID',
`rollback_info` longblob NOT NULL COMMENT 'LOG',
`status` int(11) NOT NULL COMMENT '狀態',
`server` varchar(32) NOT NULL COMMENT '分支所在 DB IP',
PRIMARY KEY (`id`),
KEY `unionkey` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=211225994 DEFAULT CHARSET=utf8 COMMENT='事務日志表';
通過上述配置可以將多個數據源加入一個事務中,多個數據源中的數據會保持強一致。一旦有異常返回給包含 @TxcTransaction 注解的方法,都會導致這個全局事務數據回滾到之前的狀態。
添加應用依賴
GTS 應用代碼的依賴包含兩部分:
- Spring: GTS 依賴 Spring 實現了 @TxcTransaction 注解的事務感知能力,因此,GTS 對 Spring 框架是強依賴的。
- 基礎依賴包和數據庫驅動包。
- 在 GTS 工程的 pom.xml 文件中添加 Spring 依賴。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
說明 Spring 3.0 及以上版本對 Spring Bean 提供了穩定的性能和功能支持,且在實際使用中較為普遍,建議使用。使用 Spring 3.0 以上版本依賴,請在上面的實例代碼前添加版本字段。
<properties>
<spring-version>3.2.17.RELEASE</spring-version>
</properties>
- 在 pom.xml 文件中,配置基礎依賴包和數據庫驅動包的依賴。
- 日志打印:GTS 客戶端依賴 SLF4J 接口編程,客戶端 txcXXXX.log 的打印依賴應用在配置文件中指定的日志實現,logback 可以更快更好的實現日志打印。
- 版本:在將 MQ、EDAS 等加入事務時,使用最新版本可以更好的和 GTS 兼容。
- 數據源:下面實例中的數據源為 MySQL,當需要使用其它資源時,請修改 MySQL 依賴部分字段。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>com.taobao.middleware</groupId>
<artifactId>logger.api</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.33.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.81</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>com.taobao.diamond</groupId>
<artifactId>diamond-client</artifactId>
<version>edas-3.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
執行結果
配置完成后,在 GTS 控制臺可以查看這些事務及其分組的狀態。