全部产品
云市场

常见问题

更新时间:2020-03-18 18:29:33

分布式事务的常见问题如下:


分布式事务是否支持 VPC 私有云部署?

支持,如有需要,请提交工单申请,或者咨询金融科技售后。


在分布式事务服务挂掉的情况下,事务是否能正常回滚?

分布式事务的服务端会记录下事务的状态并持久化,即使服务挂掉,在服务重新启动后,事务仍然能够正常回滚。


建表时,是否可以使用 SQL 的关键字作为列的名称?

不可以,建表时列名不能使用 SQL 的关键字,如 DESC、TABLE 等。


接入分布式事务时需要依赖什么?

如果您使用的是数据访问代理中的分布式事务,因为数据访问代理和分布式事务已经深度集成,部署时是不需要任何依赖的,仅需一行事务开启 SQL 语句就能开启事务。

如果您是基于 SDK 方式使用分布式事务,就需要在引入的分布式事务 SDK 的 pom.xml 中加入相关依赖,详见开发指南。


开通分布式事务之后,SOFABoot、Dubbo、消息队列、数据访问代理、RDS、MySQL、Oracle、OceanBase 能否都加入分布式事务?

可以,分布式事务已经打通了 SOFABoot、Dubbo、消息队列、数据访问代理、RDS、MySQL、Oracle、OceanBase 之间的事务。


服务 A 调用服务 B,服务 A 上加了分布式事务并开启事务注解,服务 B 没有注解,那么,A 和 B 是否在同一个分布式事务中?

A 和 B 在一个事务中。只要服务 A 的函数上加入了分布式事务的注解,那么服务 A 注解函数下面所有的被调用的服务及其子调用的服务都会加入到这个服务 A 的事务中。


开发或运维中遇到问题,希望排查分布式事务,分布式事务的 SDK 日志记录在哪里,怎么查看分布式事务日志?

分布式事务的事务日志存放路径为 ${user.home}/logs/dtx-xxx.log,其中 ${user.home} 为启动分布式事务 SDK 的用户账户的根目录。

查看日志时,可以按照分布式事务的事务 ID 去查看这个事务在该 SDK 都操作了哪些资源及其提交和回滚情况。


分布式事务是否支持多机房高可用?

分布式事务支持同城、异地多活,高可用。当一个机房由于断网、停电等突发状况造成全机房不可用时,分布式事务能切换到备用机房继续提供服务。


如何判断分布式事务 SDK 与事务云服务的网络连接是否正常?

在事务云服务上执行 netstat -an | grep 14200,看是否存在 TCP 连接。如果存在 TCP 连接,说明事务云服务启动正常;否则说明事务云服务已宕机或者网络已中断。


分布式事务 SDK 与事务云服务网络连接正常,但是通信失败,是什么原因?

TCP 连接正常,说明事务云服务启动正常。

分布式事务 SDK 与事务云服务通信返回失败消息,说明 SDK 发送给事务云服务的消息违反某些约束条件,可以根据事务 ID 在 dtx-rpc.log 中查询事务云服务返回的具体失败信息。


如何查看分布式事务的日志?

分布式事务的事务日志存放路径为 ${user.home}/logs/dtx-xxx.log,其中 ${user.home} 为启动分布式事务 SDK 的用户账户的根目录。不同的日志文件,打印的日志内容也不同,具体如下:

dtx-client.log 打印 SDK 启动和所有事务执行情况的日志;

dtx-rpc.log 打印 SDK 与分布式事务服务端的所有通信信息;

dtx-parser.log 打印 SQL 语句语法解析日志;

dtx-rm.log 打印所有参与者(TCC、FMT)的二阶段执行日志;

dtx-datasource.log 打印 FMT 模式下的事务执行日志。


Data too long for column ‘log_Info’

现象

DTX 创建事务分支报错:Data too long for column 'log_Info'

原因

业务代码更新的数据库内容太多,超过了 log_info 的最大长度。

解决方案

优化业务代码:

  • 最好是让业务优化 SQL 逻辑。
  • 或者修改表中该字段的类型,比如 LONGBLOB

错误码:“DTX-037: invoke dtx-server to create Activity failed.”

现象

  • 客户端启动 DTX 失败,错误码:“DTX-037: invoke dtx-server to create Activity failed.”
  • 在 DTX server 端,实际错误码为 error code: 101。示例如下:服务端信息
  • 在控制台转换字符编码,可以看到实际的错误是:数据源最大连接数已满,并且在超时时间范围内没有新的连接释放。示例如下:控制台信息

原因

DTX server 与 DTX DB 的数据库连接数被设置成了 2。

解决方案

可以在 dtx-config 数据库,dtx_recovery_ds 表里面,查看 db_conn_max 字段,并将两个表的 db_conn_max 修改为 20,然后重启 DTX server(一般为两台)。

说明

  • 旧版的 DTX server 默认为 2,新版的为 20。
  • DTX server 没有用 zdal,而是用的 dbcp 连接池。

错误码:“Dtx-036 activity record is not exist”

现象

报错信息为:Dtx-036 activity record is not exist。示例如下:dtx036

原因

示例中,事务的请求者和事务的参与者的 instanceId 不匹配:

  • 事务 ds:jdbc:mysql://10.10.29.212:2883 配置错误,instanceId 配置成了 000001,使得事务请求方 instanceId = 000001
  • 事务的真实 instanceId8PCDDO6Y2OEV

解决方案

排查事务的参与方的 application.properties 配置,将 instanceId 更改为 8PCDDO6Y2OEV