分布式事务之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.
分享