全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网

注意事项

更新时间:2017-07-27 17:55:20

1、同一台机器上只允许运行一个 GTS 客户端。

GTS 的 Server 端需要通过 IP 地址映射 GTS 事务的来源,多个进程同一个 IP 会导致 GTS 的 Server 端无法识别事务来源,造成潜在事务启动问题。

2、在 GTS 中使用 MQ 时,com.taobao.txc.client.aop.MTRelationShipManager 一定要先于 com.taobao.txc.client.aop.TxcTransactionScaner 进行声明。

  1. <bean class="com.taobao.txc.client.aop.MTRelationShipManager">
  2. <property name="beanNames" ref="mtServicesClassList" />
  3. <property name="interceptorNames">
  4. <list>
  5. <value>mtBranchInterceptor</value>
  6. </list>
  7. </property>
  8. <property name="order" value="1"></property>
  9. <property name="proxyTargetClass" value="false">
  10. </property>
  11. </bean>
  12. <bean class="com.taobao.txc.client.aop.TxcTransactionScaner">
  13. <constructor-arg value="test111.1325460969176422.BJ"/>
  14. <constructor-arg value="3"/>
  15. </bean>

3、使用 RDS(MySQL)时需要使用 GTS 提供的数据源包,才能自动开启分布式事务。

  1. <bean id="DataSource_rds" class="com.taobao.txc.datasource.cobar.TxcDataSource">
  2. <property name="url" value="jdbc:mysql://rds-ip:3306/xxx" />
  3. <property name="username" value="xxx" />
  4. <property name="password" value="xxx" />
  5. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  6. </bean>

4、仅使用 DRDS 作为数据源时,无需配置注解和引入 GTS SDK,需要用户手工处理事务提交和回滚。在使用过程中一定要保证每个全局事务单独一个数据库连接,否则会造成 select last_txc_xid() 获取全局事务失败。

5、单个事务内的 SQL 语句不能超过1000 条,建议少于 200 条。

虽然 GTS 本身支持大事务的存在,最高支持 1000 条 SQL 语句,但还是建议使用时不要超过 200 条。原因有以下两方面:

  • 大事务会造成事务执行时间上升,事务信息规模扩大,导致系统性能下降。

  • 大事务容易造成潜在的事务数据不一致问题。

    如果有特殊业务,需要单个事务超过1000条 SQL 语句,请提交工单申请。

6、GTS 业务表必须有主键。

GTS 需要主键索引来帮助快速进行提交和回滚,从而提升分布式事务效率。所以,每个涉及到使用 GTS 事务的业务表,都需要设置唯一主键。使用时有以下 2 点注意事项:

  • 只支持单列主键(可以为自增列),不支持多列联合主键。

  • 不能使用函数对主键赋值,例如 uuid_short()。

7、GTS 的缺省事务隔离级别为读未提交,该模式下可以达到分布式事务的最大性能。如果有特殊业务需要隔离级别为读已提交,可以使用 SQL 的 for update。注意: 此读已提交的 for update 必须在一个 GTS 的分布式事务内部才能生效。

GTS 的读已提交用法举例如下:

  1. select name from tb where id =1 for update;

注意:如果您需要读已提交以上的隔离级别,或者您对 GTS 的读未提交尚存疑虑,请提工单申请,让 GTS 开发人员协助您优化您的事务和相关SQL。

8、保证所有 GTS 事务管理范围内的数据,都不会被 GTS 管理范围外的系统所修改。

GTS 的全局数据库写锁仅针对加入了 GTS 事务的数据库操作,如果一个对数据库的写操作不在 GTS 事务管理的范围内,会造成“脏写”。例如,一个写操作在 GTS 事务中对一条数据进行了修改,但是尚未提交,用户用 MySQL 控制台(不在 GTS 事务范围内)对该数据也进行了修改,而此时业务驱动前面的GTS事务回滚,这次回滚会失败,造成数据不一致。为避免该问题,您需要保证所有 GTS 事务管理范围内的数据,都不会被 GTS 管理范围外的系统所修改

9、使用 Druid 连接池,要将 Druid 连接池的 SQL 缓存功能关闭。

在 Druid 开启 SQL 缓存功能后,Druid 会将前一次执行的带事务上下文的 SQL 语句缓存起来。这样,在另一个事务进行时,发送这个带有过期事务上下文的 SQL 就会被认为时无效并且会出现 “commit failure” 这样的错误。所以,在 EDAS 服务中开启 GTS 事务并且使用了 Druid 连接池时,需要将 Druid 连接池的 SQL 缓存功能关闭。

10、GTS 注解方法的调用

建议在当前方法中直接实例化 @TxcTransaction 注解的方法的类,并直接调用,保证 GTS 事务生效,且代码直观。

说明

GTS 注解方法的调用有以下三点注意事项:

  • 带有 @TxcTransaction 注解的方法可以在其他的类中被调用,但需要显式的指定的 Spring bean 实例。

  • 如果 @TxcTransaction 注解方法在本类的其他方法中被调用,需要显式指定实例。

  • 开启事务只能直接调用使用 Spring bean 实例化的类的 @TxcTransaction 注解方法。

例子

  1. class SampleClient { /* 此类已经被声明为 Spring bean */
  2. //此方法被声明为 GTS 事务
  3. @TxcTransaction(timeout = 60000)
  4. void dataUpdate(Connection con1, Connection con2) {
  5. // 操作数据源 con
  6. update1(con1);
  7. update2(con2);
  8. }
  9. public void callUpdate1(Connection con1, Connection con2){
  10. dataUpdate(con1,con2);
  11. }
  12. public void callUpdate2(Connection con1, Connection con2, SampleClient clienttest){
  13. clienttest.dataUpdate(con1,con2);
  14. }
  15. public static void main(String[] args){
  16. SampleClient clienttest1 = (SampleClient)context.getBean("clientTest");
  17. Connection con1=getCon1();
  18. Connection con2=getCon2();
  19. clienttest1.dataUpdate(con1,con2);// 这个是正确的调用,最佳实践
  20. SampleClient clienttest2 = new SampleClient();
  21. clienttest2.dataUpdate(con1,con2);// 这个是错误的调用,不能开启 GTS 事务
  22. clienttest1.callUpdate1(con1,con2); // 这个是错误的调用,不能开启 GTS 事务
  23. clienttest1.callUpdate2(con1,con2, clienttest1);// 这个是正确的调用,但是不推荐使用
  24. }
  25. }
  26. class UseSampleClient {
  27. void updateSampleClient(){
  28. SampleClient clienttest1 = (SampleClient)context.getBean("clientTest");
  29. clienttest1.dataUpdate(con1,con2);// 这个是正确的调用,最佳实践
  30. SampleClient clienttest2 = new SampleClient();
  31. clienttest2.dataUpdate(con1,con2);// 这个是错误的调用,不能开启 GTS 事务
  32. }
  33. }

11、建表时,列不能为 SQL 的关键字,如 DESC、TABLE 等。

本文导读目录