常见问题
1.Seata 目前可以用于生产环境吗?2.Seata 目前支持高可用吗?
3.undo_log 表 log_status=1 的记录是做什么用的?
4.怎么使用 Seata 框架,来保证事务的隔离性?
5.脏数据回滚失败如何处理?
6.为什么分支事务注册时, 全局事务状态不是 begin?
7.Nacos 作为 Seata 配置中心时,项目启动报错找不到服务。如何排查,如何处理?
8.Eureka 做注册中心,TC 高可用时,如何在 TC 端覆盖 Eureka 属性?
9.java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.jsontype.TypeSerializer.typeId(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonToken;)?
10.为什么 mybatis 没有返回自增 ID?
11.io.seata.codec.protobuf.generated 不存在,导致 seata server 启动不了?
12.TC 如何使用 mysql8?
13.支持多主键?
14.使用 HikariDataSource 报错如何解决 ?
15.是否可以不使用 conf 类型配置文件,直接将配置写入 application.properties?
16.如何自己修改源码后打包 seata-server ?
17. Seata 支持哪些 RPC 框架 ?
18. java.lang.NoSuchMethodError: com.alibaba.druid.sql.ast.statement .SQLSelect.getFirstQueueBlockLcom/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock;
19. apache-dubbo 2.7.0 出现 NoSuchMethodError ?
20. 使用 AT 模式需要的注意事项有哪些 ?
21. win 系统使用同步脚本进行同步配置时为什么属性会多一个空行?
22. AT 模式和 Spring @Transactional 注解连用时需要注意什么 ?
23. Spring boot 1.5.x 出现 jackson 相关 NoClassDefFoundException ?
24. SpringCloud xid 无法传递 ?
25. 使用动态数据源后的常见问题 ?
26. Could not found global transaction xid = %s, may be has finished.
27. TC 报这个错:An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception 是什么原因?
28. 数据库开启自动更新时间戳导致脏数据无法回滚?
29. 还没到全局事务超时时间就出现了 timeoutrollcking?
30. Seata 现阶段支持的分库分表解决方案?
31. Seata 使用注册中心注册的地址有什么限制?
32. seata-server cannot be started due to Unrecognized VM option 'CMSParallelRemarkEnabled' Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.导致 seata-server 无法启动?
33. Seata 的 SQL 支持范围?
34. Seata 的 JDK 版本要求?
35. Oracle 的 NUMBER 长度超过 19 之后,实体使用 Long 映射,导致获取不到行信息,导致 undo_log 无法插入,也无法回滚?
36. 怎么处理 io.seata.rm.datasource.exec.LockConflictException: get global lock fail ?
37. 为什么在客户端在编译和运行时 JDK 版本都是 1.8 的情况下还会出现 java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer 错误 ?
38. 为什么在使用 Apple 的 M1 芯片下载 maven 依赖时,无法下载依赖
com.google.protobuf:protoc:exe:3.3.0
?
39. 1.4.2 及以下版本回滚时抛出 Cannot construct instance of
java.time.LocalDateTime
40. Seata-Server 使用 DB 作为存储模式时,有哪些注意事项?
41. Oracle 使用 timestamp 字段类型回滚失败?
42. 抛出异常后事务未回滚?
43. 怎么处理@FeignClient 注解 url 不起效,提示 Load balancer does not have available server for client 错误?
Q: 1.Seata 目前可以用于生产环境吗?
A: 0.4.2 版本之后就可以上生产环境,欢迎已经在使用的企业参与此 issue:who's using Seata
Q: 2.Seata 目前支持高可用吗?
A: 0.6 版本开始支持,tc 使用 db 模式共享全局事务会话信息,注册中心使用非 file 的 seata 支持的第三方注册中心
Q: 3.undo_log表log_status=1的记录是做什么用的?
A:
- 场景 : 分支事务 a 注册 TC 后,a 的本地事务提交前发生了全局事务回滚
- 后果 : 全局事务回滚成功,a 资源被占用掉,产生了资源悬挂问题
- 防悬挂措施: a 回滚时发现回滚 undo 还未插入,则插入一条 log_status=1 的 undo 记录,a 本地事务(业务写操作 sql 和对应 undo 为一个本地事务)提交时会因为 undo 表唯一索引冲突而提交失败。
Q: 4.怎么使用Seata框架,来保证事务的隔离性?
A: 因 seata 一阶段本地事务已提交,为防止其他事务脏读脏写需要加强隔离。
- 脏读 select 语句加 for update,代理方法增加@GlobalLock+@Transactional 或@GlobalTransactional
- 脏写 必须使用@GlobalTransactional 注:如果你查询的业务的接口没有@GlobalTransactional 包裹,也就是这个方法上压根没有分布式事务的需求,这时你可以在方法上标注@GlobalLock+@Transactional 注解,并 且在查询语句上加 for update。 如果你查询的接口在事务链路上外层有@GlobalTransactional 注解,那么你查询的语句只要加 for update 就行。设计这个注解的原因是在没有这个注解之前,需要查询分布式事务读已提交的数据,但业务本身不需要分布式事务。 若使用@GlobalTransactional 注解就会增加一些没用的额外的 rpc 开销比如 begin 返回 xid,提交事务等。GlobalLock 简化了 rpc 过程,使其做到更高的性能。
Q: 5.脏数据回滚失败如何处理?
A:
-
脏数据需手动处理,根据日志提示修正数据或者将对应 undo 删除(可自定义实现 FailureHandler 做邮件通知或其他)
-
关闭回滚时 undo 镜像校验,不推荐该方案。
注:建议事前做好隔离保证无脏数据
Q: 6.为什么分支事务注册时, 全局事务状态不是begin?
A:
- 异常:Could not register branch into global session xid = status = Rollbacked(还有 Rollbacking、AsyncCommitting 等等二阶段状态) while expecting Begin
- 描述:分支事务注册时,全局事务状态需是一阶段状态 begin,非 begin 不允许注册。属于 seata 框架层面正常的处理,用户可以从自身业务层面解决。
- 出现场景(可继续补充)
1. 分支事务是异步,全局事务无法感知它的执行进度,全局事务已进入二阶段,该异步分支才来注册
2. 服务a rpc 服务b超时(dubbo、feign等默认1秒超时),a上抛异常给tm,tm通知tc回滚,但是b还是收到了请求(网络延迟或rpc框架重试),然后去tc注册时发现全局事务已在回滚
3. tc感知全局事务超时(@GlobalTransactional(timeoutMills = 默认60秒)),主动变更状态并通知各分支事务回滚,此时有新的分支事务来注册
Q: 7.Nacos 作为 Seata 配置中心时,项目启动报错找不到服务。如何排查,如何处理?
A: 异常:io.seata.common.exception.FrameworkException: can not register RM,err:can not connect to services-server.
-
查看 nacos 配置列表,seata 配置是否已经导入成功
-
查看 nacos 服务列表,serverAddr 是否已经注册成功
-
检查 client 端的 registry.conf 里面的 namespace,registry.nacos.namespace 和 config.nacos.namespace 填入 nacos 的命名空间 ID,默认"",server 端和 client 端对应,namespace 为 public 是 nacos 的一个保留控件,如果您需要创建自己的 namespace,最好不要和 public 重名,以一个实际业务场景有具体语义的名字来命名
-
nacos 上服务 列表,serverAddr 地址对应 ip 地址应为 seata 启动指定 ip 地址,如:sh seata-server.sh -p 8091 -h 122.51.204.197 -m file
-
查看 seata/conf/nacos-config.txt 事务分组 service.vgroupMapping.trade_group=default 配置与项目分组配置名称是否一致
-
telnet ip 端口 查看端口是都开放,以及防火墙状态
注:1.080 版本启动指定 ip 问题,出现异常 Exception in thread "main" java.lang.RuntimeException: java.net.BindException: Cannot assign request address,请升级到 081 以上版本 2.项目使用 jdk13,启动出现
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
如环境为sh,替换脚本中最后一段:
exec "$JAVACMD" $JAVA_OPTS -server -Xmx2048m -Xms2048m -Xmn1024m -Xss512k -XX:SurvivorRatio=10 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=1024m -XX:-OmitStackTraceInFastThrow -XX:-UseAdaptiveSizePolicy -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="$BASEDIR"/logs/java_heapdump.hprof -XX:+DisableExplicitGC -XX:+CMSParallelRemarkEnabled -XX:+
UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -verbose:gc -Dio.netty.leakDetectionLevel=advanced \
-classpath "$CLASSPATH" \
-Dapp.name="seata-server" \
-Dapp.pid="$$" \
-Dapp.repo="$REPO" \
-Dapp.home="$BASEDIR" \
-Dbasedir="$BASEDIR" \
io.seata.server.Server \
"$@"