分布式事务之Seata常见异常
条评论关于log_status=1的记录
网上都说是防悬挂,具体是指啥又没说清楚。这里先说结论:这个条记录,你可以不用管它。
防悬挂,因为网络延迟或者第一阶段请求丢包,导致第二阶段的回滚请求,先到RM,RM此时没有处理第一阶段请求,没有记录undo_log,所以插入该记录,作为一个防御性的操作,阻止后到的第一阶段请求继续执行。
产生的另一个原因是,请检查项目中是否为多数据源。如果是,需要把seata自动代理关了,一般多数据源都是有开发者已经手动代理了。二阶段的时候,下发找datasource,找到的不是你业务操作数据库的datasource,导致没发现undolog,就插了一条status=1。
1  | # 关闭自动代理  | 
关于log_status=0的记录
seata-server宕机后,分支事务的undo_log中将出现log_status=0的记录,重新seata-server后,会自动处理掉这些日志。
异常:ShouldNeverHappenException
1  | Error preparing statement. Cause: io.seata.common.exception.ShouldNeverHappenException: [xid:172.19.0.204:8091:9483xxxxxxxxx]get tablemeta failed  | 
解决方案:检查表是否存在。
异常:SQLJoinTableSource
1  | java.lang.ClassCastException: com.alibaba.druid.sql.ast.statement.SQLJoinTableSource cannot be cast to com.alibaba.druid.sql.ast.statement.SQLExprTableSource;  | 
出现原因:update语句不能join其他表。
异常:TmTransactionException
1  | Failed to begin transaction.  | 
查看seata-server是否抛出类似的错误:
1  | writeSession error, global session size exceeded, size : 566 maxBranchSessionSize : 512  | 
解决方案:开启全局事务的方法入参太多。
异常:TransactionException
1  | TransactionException[Could not register branch into global session xid = 172.32.1.161:8091:113670****4512 status = AsyncComm ]  | 
产生原因:在 @GlobalTransactional 的外面使用 @Transactional 修饰了,例如:
1  | 
  | 
- 本文链接:https://www.ofcoder.com/2021/06/23/java/%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E4%B9%8BSeata%E5%B8%B8%E8%A7%81%E5%BC%82%E5%B8%B8/
 - 版权声明:Copyright © 并发笔记 - ofcoder.com. Author by far.
 
分享