Syrent 2356
10/25/2025, 2:13 PMval database = R2dbcDatabase.connect(
Config.get().database.url,
user = Config.get().database.user,
password = Config.get().database.password,
)
class SQLDatabase : Database {
init {
TransactionManager.defaultDatabase = database
}
}
suspend fun <T> newSuspendingTransactionAsync(
transaction: suspend Transaction.() -> T
): T = suspendTransaction(database) { transaction() }
I use it like this in my service:
suspend fun getProviderById(id: String): Provider? =
newSuspendingTransactionAsync {
Provider.Schema
.selectAll()
.where { Provider.Schema.id eq id }
.firstOrNull()
?.toProvider()
}
And this is my Ktor route:
get("{id}") {
val id = call.parameters["id"]
if (id == null) {
call.respond(HttpStatusCode.BadRequest, mapOf("response" to "Provider ID is required"))
return@get
}
val provider = ProviderService.getProviderById(id).await()
if (provider == null) {
call.respond(HttpStatusCode.NotFound, mapOf("response" to "Provider not found"))
return@get
}
call.respond(HttpStatusCode.OK, provider)
}
When I call this endpoint, I get the following error:
2025-10-25 17:40:27.391 [reactor-tcp-epoll-3] WARN o.m.r2dbc.message.server.ErrorPacket - Error: 'Transaction characteristics can't be changed while a transaction is in progress' sqlState='25001' code=1568
2025-10-25 17:40:27.393 [reactor-tcp-epoll-3] ERROR Application - Unhandled: GET - /api/v1/provider/sayanserver
java.lang.IllegalStateException: No transaction in context.
at org.jetbrains.exposed.v1.core.transactions.CoreTransactionManager.currentTransaction(CoreTransactionManager.kt:96)
at org.jetbrains.exposed.v1.core.vendors.DatabaseDialectKt.getCurrentDialect(DatabaseDialect.kt:169)
at org.jetbrains.exposed.v1.r2dbc.statements.R2dbcConnectionImpl.r2dbcPreparedSql(R2dbcConnectionImpl.kt:127)
...