diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java index 6e85e9a5688a..20f27a86e420 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -307,11 +307,12 @@ protected Object invokeWithinTransaction(Method method, @Nullable Class targe } else { + Object result; final ThrowableHolder throwableHolder = new ThrowableHolder(); // It's a CallbackPreferringPlatformTransactionManager: pass a TransactionCallback in. try { - Object result = ((CallbackPreferringPlatformTransactionManager) tm).execute(txAttr, status -> { + result = ((CallbackPreferringPlatformTransactionManager) tm).execute(txAttr, status -> { TransactionInfo txInfo = prepareTransactionInfo(tm, txAttr, joinpointIdentification, status); try { return invocation.proceedWithInvocation(); @@ -336,12 +337,6 @@ protected Object invokeWithinTransaction(Method method, @Nullable Class targe cleanupTransactionInfo(txInfo); } }); - - // Check result state: It might indicate a Throwable to rethrow. - if (throwableHolder.throwable != null) { - throw throwableHolder.throwable; - } - return result; } catch (ThrowableHolderException ex) { throw ex.getCause(); @@ -359,11 +354,17 @@ protected Object invokeWithinTransaction(Method method, @Nullable Class targe } throw ex2; } + + // Check result state: It might indicate a Throwable to rethrow. + if (throwableHolder.throwable != null) { + throw throwableHolder.throwable; + } + return result; } } /** - * Clear the cache. + * Clear the transaction manager cache. */ protected void clearTransactionManagerCache() { this.transactionManagerCache.clear(); @@ -682,6 +683,7 @@ public String toString() { @FunctionalInterface protected interface InvocationCallback { + @Nullable Object proceedWithInvocation() throws Throwable; }