AT 模式接入適用的場景包括跨數據庫事務、MQ 的消息事務、EDAS 的服務事務及多場景混合型事務方案。本文介紹如何基于 @TxcTransaction 注解使用 GTS 服務。

前提條件

在使用 AT 模式接入 GTS 前,請先完成以下工作:

條件和約束

AT 模式的原理要求全局事務涉及的數據庫系統SchemaSQL 語句必須符合一定的規范。

  • 數據庫系統
    • 支持事務,目前支持 MySQL(RDS、PolarDB、原生MySQL)、PostgreSQL(RDS、自建)、Oracle等數據庫。
    • 數據庫表名大小寫不敏感。
    • 修改方法,例如,在 MySQL 配置文件 my.cnf 中的 [mysqld] 后添加 lower_case_table_names=1,然后重啟 MySQL 服務。
  • Schema
    • 不支持使用數據庫和 SQL 的關鍵字做表名。
    • 必須定義主鍵,且必須是唯一主鍵,不支持復合主鍵。
  • SQL 語句

    只針對 DML 語句(INSERT、UPDATE、DELETE),查詢語句(SELECT),與 GTS 工作機制無關,沒有限制。

    • 不支持修改主鍵的語句。
    • 語句涉及主鍵的值,只支持確定值或列自增,不支持函數。例如:
      INSERT INTO table_name (PK, ...) VALUES (uuid() ...)
    • 不支持嵌套語句。例如:
      INSERT INTO table_name SELECT ...
      WHERE column_name IN SELECT ...

配置應用代碼

通過審批的事務分組可以用于客戶的應用代碼中,需引入 GTS SDK 開發包,并添加依賴。

  1. 在 Spring 的配置文件中將申請好的事務分組名配置到 com.taobao.txc.client.aop.TxcTransactionScaner bean 中,并將阿里云賬號中的Access Key ID和Access Key Secret配置到 accessKeysecretKey 兩個屬性上。
    <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>            
  2. 在需要啟動全局事務的方法前添加 @TxcTransaction(appName=“myapp”) 注解。
    其中 appName 的值為事務別名,可以在 GTS 控制臺上查詢。
    @TxcTransaction(appName = "myapp")
    public void hello() {
        ...
    }           
  3. 在 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();           
  4. 如果使用的數據源是 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>           
  5. 在加入 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 框架是強依賴的。
  • 基礎依賴包和數據庫驅動包。
  1. 在 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>                    
  2. 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 控制臺可以查看這些事務及其分組的狀態。事務總覽