seata回滚问题之全局异常如何解决

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
简介: Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。

问题一:seata回滚不抛出异常,什么原因呢?


seata回滚不抛出异常,什么原因呢?


参考回答:

事务没有回滚 1、先检查异常是否被catch或者有无熔断降级 异常被catch后或熔断降级后,全局事务便不感知抛出的异常。建议catch异常后返回异常码给事务发起方(TM),然后事务发起方 (TM) 。通过API的方式回滚全局事务。 2、否则请自行debug以下方法: ExecuteTemplate#execute(List, StatementProxy, StatementCallback, java.lang.Object...) 如果没进入这个方法,说明数据源被没有代理


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/495118?spm=5176.21213303.J_qCOwPWspKEuWcmp8qiZNQ.283.6bb82f3dSLrB4q&scm=20140722.S_community@@%E9%97%AE%E7%AD%94@@495118._.ID_495118-RL_seata%E5%BC%82%E5%B8%B8-LOC_search~UND~community~UND~item-OR_ser-V_3-P0_10


问题二:全局异常处理导致seata分布式事务无法回滚问题,有什么解决方案吗?


全局异常处理导致seata分布式事务无法回滚问题,有什么解决方案吗?


参考回答:

你异常处理后,返回的http状态码不要是200就ok了


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/483110?spm=5176.21213303.J_qCOwPWspKEuWcmp8qiZNQ.293.6bb82f3dSLrB4q&scm=20140722.S_community@@%E9%97%AE%E7%AD%94@@483110._.ID_483110-RL_seata%E5%BC%82%E5%B8%B8-LOC_search~UND~community~UND~item-OR_ser-V_3-P0_12


问题三:什么方法可以在那个链路出现异常的时候,直接请求seata事务控制器直接回滚?


什么方法可以在那个链路出现异常的时候,直接请求seata事务控制器直接回滚?


参考回答:

api可以做到在rm侧发起回滚,但是如果被滥用就会出现问题,比如a调b再调c,调b的时候b异常了,b用api发起回滚,回滚后a没判断b的response结果是否正常,就去调了c,c再去注册分支的时候由于事务回滚了,这个xid就找不到了,如果tm侧不去中断调用链是会出问题的


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/483111?spm=5176.21213303.J_qCOwPWspKEuWcmp8qiZNQ.298.6bb82f3dSLrB4q&scm=20140722.S_community@@%E9%97%AE%E7%AD%94@@483111._.ID_483111-RL_seata%E5%BC%82%E5%B8%B8-LOC_search~UND~community~UND~item-OR_ser-V_3-P0_13


问题四:接口使用了seata全局事务,提交几十条数据正常执行,但数据量超过两百条会报异常应该如何排查或处理?


有个接口使用了seata全局事务进行更新数据,提交几十条数据的时候正常执行,但数据量超过两百条的时候就会报异常。应该如何排查或处理?

接口所属项目报错日志: 2023-01-30 16:42:04.757 ERROR 1182262 --- [http-nio-65421-exec-4] aihma.cloud.core.base.ro.ApiRo : org.springframework.orm.jpa.JpaSystemException: Unable to commit against JDBC Connection; nested exception is org.hibernate.TransactionException: Unable to commit against JDBC Connection at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:353) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:538) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:743) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:633) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:386) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxyCglibMethodInvocation.proceed(CglibAopProxy.java:749)atio.seata.spring.annotation.GlobalTransactionalInterceptor.invoke(GlobalTransactionalInterceptor.java:156)atorg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)atorg.springframework.aop.framework.CglibAopProxyCglibMethodInvocation.proceed(CglibAopProxy.java:749)atio.seata.spring.annotation.GlobalTransactionalInterceptor.invoke(GlobalTransactionalInterceptor.java:156)atorg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)atorg.springframework.aop.framework.CglibAopProxyCglibMethodInvocation.proceed(CglibAopProxy.java:749) at io.seata.spring.annotation.GlobalTransactionalInterceptor.invoke(GlobalTransactionalInterceptor.java:156) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxyCglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxyDynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)ataihma.cloud.mvc.service.aliIot.impl.SceneServiceImplDynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)ataihma.cloud.mvc.service.aliIot.impl.SceneServiceImplDynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at aihma.cloud.mvc.service.aliIot.impl.SceneServiceImplEnhancerBySpringCGLIB1e408270.editScene()ataihma.cloud.mvc.controller.aliIot.SceneController.edit1e408270.editScene()ataihma.cloud.mvc.controller.aliIot.SceneController.edit1e408270.editScene() at aihma.cloud.mvc.controller.aliIot.SceneController.editoriginaltn61hLv0(SceneController.java:315)ataihma.cloud.mvc.controller.aliIot.SceneController.edittn61hLv0(SceneController.java:315)ataihma.cloud.mvc.controller.aliIot.SceneController.edittn61hLv0(SceneController.java:315) at aihma.cloud.mvc.controller.aliIot.SceneController.editoriginaltn61hLv0tn61hLv0tn61hLv0accessorGjOfNFeB(SceneController.java)ataihma.cloud.mvc.controller.aliIot.SceneControllerGjOfNFeB(SceneController.java)ataihma.cloud.mvc.controller.aliIot.SceneControllerGjOfNFeB(SceneController.java) at aihma.cloud.mvc.controller.aliIot.SceneControllerauxiliary$KFpS4hDy.call(Unknown Source) at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:86) at aihma.cloud.mvc.controller.aliIot.SceneController.edit(SceneController.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) .....

Caused by: org.hibernate.TransactionException: Unable to commit against JDBC Connection at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.commit(AbstractLogicalConnectionImplementor.java:87) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:272) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:534) ... 78 more

Caused by: io.seata.rm.datasource.exec.LockConflictException: get global lock fail, xid:172.29.222.218:8091:363364799438757888, lockKeys:iot_scenes_settings:8296716702708613139;iot_scenes_settings:8296716713349562374;过长省略...... at io.seata.rm.datasource.ConnectionProxy.recognizeLockKeyConflictException(ConnectionProxy.java:155) at io.seata.rm.datasource.ConnectionProxy.processGlobalTransactionCommit(ConnectionProxy.java:221) at io.seata.rm.datasource.ConnectionProxy.doCommit(ConnectionProxy.java:199) at io.seata.rm.datasource.ConnectionProxy.lambdacommitcommitcommit0(ConnectionProxy.java:184) at io.seata.rm.datasource.ConnectionProxy$LockRetryPolicy.execute(ConnectionProxy.java:292) at io.seata.rm.datasource.ConnectionProxy.commit(ConnectionProxy.java:183) at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.commit(AbstractLogicalConnectionImplementor.java:81) ... 81 more


参考回答:

其他事务占用了全局锁还没释放


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/483109?spm=5176.21213303.J_qCOwPWspKEuWcmp8qiZNQ.303.6bb82f3dSLrB4q&scm=20140722.S_community@@%E9%97%AE%E7%AD%94@@483109._.ID_483109-RL_seata%E5%BC%82%E5%B8%B8-LOC_search~UND~community~UND~item-OR_ser-V_3-P0_14


问题五:全局异常处理导致seata分布式事务无法回滚问题,有人用AOP的方法解决过吗,多个服务怎么弄?


全局异常处理导致seata分布式事务无法回滚问题,有人用AOP的方法解决过吗,多个服务怎么弄?


参考回答:

使用AOP手动开启全局事务并进行回滚。

@Aspect
@Component
@Slf4j
public class WorkAspect {
    @Before("execution(* com.trs.slivlooncloud.service.*.*(..))")
    public void before(JoinPoint joinPoint) throws TransactionException {
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        Method method = signature.getMethod();
        GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
        tx.begin(300000, "tran");
        log.info("**********创建分布式事务完毕 {}" , tx.getXid());
    }
    @AfterThrowing(throwing = "e", pointcut = "execution(* com.trs.slivlooncloud.service.*.*(..))")
    public void doRecoveryActions(Throwable e) throws TransactionException {
        log.info("方法执行异常:{}", e.getMessage());
        if (!StringUtils.isBlank(RootContext.getXID())) {
            GlobalTransactionContext.reload(RootContext.getXID()).rollback();
        }
    }
}

——参考来源于SEATA官方文档


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/482623?spm=5176.21213303.J_qCOwPWspKEuWcmp8qiZNQ.308.6bb82f3dSLrB4q&scm=20140722.S_community@@%E9%97%AE%E7%AD%94@@482623._.ID_482623-RL_seata%E5%BC%82%E5%B8%B8-LOC_search~UND~community~UND~item-OR_ser-V_3-P0_15

相关文章
|
6月前
|
Kubernetes Cloud Native Java
Seata常见问题之回滚一直在重试如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
|
6月前
|
数据库 开发者
Seata调用问题之全局异常捕获没法回滚如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
504 8
|
6月前
|
SQL API 数据库
Seata AT模式问题之抛出异常触发回滚如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题
546 10
|
6月前
|
SQL Oracle 关系型数据库
seata版本问题之码云拉取代码异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
276 7
|
6月前
|
监控 数据库
在Seata中一张表使用了联合主键,在事务回滚时报异常,改为单个主键,就没有这个异常,如何解决?
在Seata中一张表使用了联合主键,在事务回滚时报异常,改为单个主键,就没有这个异常,如何解决?
|
5月前
|
Apache 开发者
Apache Seata 如何解决 TCC 模式的幂等、悬挂和空回滚问题
【6月更文挑战第8天】Apache Seata 是一款分布式事务框架,解决TCC模式下的幂等、悬挂和空回滚问题。通过记录事务状态处理幂等,设置超时机制避免悬挂,明确标记Try操作成功来处理空回滚。Seata 提供丰富配置和管理功能,确保分布式事务的可靠性和效率,支持复杂事务处理场景,为企业业务发展提供支持。
211 7
|
6月前
|
Oracle 安全 Java
Seata常见问题之启动seata一直报空指针异常如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
|
2月前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
6月前
|
存储 关系型数据库 MySQL
基于Seata实现分布式事务
通过以上步骤,你可以使用 Seata 实现分布式事务,确保在微服务架构中的事务一致性。Seata 支持多种语言和框架,能够满足不同业务场景的需求。欢迎关注威哥爱编程,一起学习成长。
159 1
|
3月前
|
关系型数据库 MySQL 数据库
SpringCloud2023中使用Seata解决分布式事务
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。Seata简化了这个使用过程。
85 2