Skip to content

Commit 1f13516

Browse files
committed
Fix @transactional support on suspending function
With this commit, @transactional on suspending functions returning a value now commits the transaction properly. Closes gh-25998
1 parent 6bb3ad7 commit 1f13516

File tree

2 files changed

+2
-4
lines changed

2 files changed

+2
-4
lines changed

spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -875,8 +875,8 @@ public Object invokeWithinTransaction(Method method, @Nullable Class<?> targetCl
875875

876876
String joinpointIdentification = methodIdentification(method, targetClass, txAttr);
877877

878-
// Optimize for Mono
879-
if (Mono.class.isAssignableFrom(method.getReturnType())) {
878+
// For Mono and suspending functions not returning kotlinx.coroutines.flow.Flow
879+
if (Mono.class.isAssignableFrom(method.getReturnType()) || (KotlinDetector.isSuspendingFunction(method) && !COROUTINES_FLOW_CLASS_NAME.equals(new MethodParameter(method, -1).getParameterType().getName()))) {
880880
return TransactionContextManager.currentContext().flatMap(context ->
881881
createTransactionIfNecessary(rtm, txAttr, joinpointIdentification).flatMap(it -> {
882882
try {

spring-tx/src/test/kotlin/org/springframework/transaction/annotation/CoroutinesAnnotationTransactionInterceptorTests.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package org.springframework.transaction.annotation
1919
import kotlinx.coroutines.delay
2020
import kotlinx.coroutines.runBlocking
2121
import org.assertj.core.api.Assertions
22-
import org.junit.jupiter.api.Disabled
2322
import org.junit.jupiter.api.Test
2423
import org.springframework.aop.framework.ProxyFactory
2524
import org.springframework.transaction.interceptor.TransactionInterceptor
@@ -64,7 +63,6 @@ class CoroutinesAnnotationTransactionInterceptorTests {
6463
}
6564

6665
@Test
67-
@Disabled("Currently fails due to gh-25998")
6866
fun suspendingValueSuccess() {
6967
val proxyFactory = ProxyFactory()
7068
proxyFactory.setTarget(TestWithCoroutines())

0 commit comments

Comments
 (0)