spring 事务服务引发意外回滚异常的方面

2ic8powd  于 2023-03-16  发布在  Spring
关注(0)|答案(2)|浏览(142)

我对事务性服务中的方法很有看法。不幸的是,当我按服务捕获错误时,会抛出另一个异常。我如何防止此错误?* 我搜索了类似的问题,但似乎没有一个解决方案适合我的情况

@Aspect
@Component
public class ServiceGuard {   
    @Pointcut("execution(* simgenealogy.service.*.*(..))")
    public void persistence() {}

    @Around("persistence()")
    public Object logPersistence(ProceedingJoinPoint joinPoint) { 
        try {
            Object o =  joinPoint.proceed();
            return o;
        } catch (ConstraintViolationException constraintException) {
            // (...)
            return null;
        } catch (Throwable throwable) {
            // (...)
            return null;
        }
    }
}

和错误日志。

2019-07-29 02:10:37.979 ERROR 11300 --- [ion Thread] s.a.g.s.w.ServiceGuard                   :
            Constraint violation: First Name cannot be empty
2019-07-29 02:10:38.023 ERROR 11300 --- [ion Thread] s.a.g.s.w.ServiceGuard                   :
            Constraint violation: Last Name cannot by empty
Exception in thread "JavaFX Application Thread" org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:714)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:534)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:305)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
    at
nwlqm0z1

nwlqm0z11#

捕捉可能有原因的异常,然后返回null作为先前执行(通过proceed())方法的结果,可能是在期望另一个非null返回值的情况下。
由于您没有提供任何应用程序代码,因此这是推测性的,但我假设null返回值随后被分配给一个应该具有非null值的数据属性(参见日志中的约束冲突)。更准确地说,您将名和姓设置为null,这将导致约束冲突,而约束冲突反过来又会导致事务回滚,因为没有设置强制数据字段。
如何解决这个问题?返回非空的名/姓默认值(虽然听起来很奇怪),或者让最初的异常升级,而不是将它们吞没并导致后续问题。
底线:您的异常处理只是出了问题,需要修复。

ghhkc1vu

ghhkc1vu2#

好的,我找到了解决方案。@Transactional也是@Arround方面。问题出在排序方面。我的Guard类实际上并不围绕Transaction。将@Order(0)放在Guard上,将@Order(1)放在@Transactional服务上解决了问题。

相关问题