使用 R2BC Kotlin 协程的数据库事务
DB transaction using R2BC Kotlin coroutine
我在 Spring Webflux 项目中使用 R2bc 和 Kotlin。它工作得很好。但是我有这个方法
@Component
class UserRepository(private val client: DatabaseClient, private val operator: TransactionalOperator) {
suspend fun updateUser(user: User, value: String): Int {
client.execute("INSERT INTO log(user_id, activity) VALUES (:user_id, :activity)")
.bind("activity", user.activity)
.bind("user_id", user.id)
.fetch()
.awaitRowsUpdated()
return client.execute("UPDATE users SET value = :value WHERE id = :id")
.bind("value", value)
.bind("id", user.id)
.fetch()
.awaitRowsUpdated()
}
此方法有效,但我想使用数据库事务。 Kotlin 支持吗
好的,我找到了我将其发布在这里的解决方案,以便其他人可以从中受益。我所要做的就是。
@Component
class UserRepository(private val client: DatabaseClient, private val operator: TransactionalOperator) {
suspend fun updateUser(user: User, value: String) =
operator.executeAndAwait {
client.execute("INSERT INTO log(user_id, activity) VALUES (:user_id, :activity)")
.bind("activity", user.activity)
.bind("user_id", user.id)
.await()
client.execute("UPDATE users SET value = :value WHERE id = :id")
.bind("value", value)
.bind("id", user.id)
.await()
}
}
我在 Spring Webflux 项目中使用 R2bc 和 Kotlin。它工作得很好。但是我有这个方法
@Component
class UserRepository(private val client: DatabaseClient, private val operator: TransactionalOperator) {
suspend fun updateUser(user: User, value: String): Int {
client.execute("INSERT INTO log(user_id, activity) VALUES (:user_id, :activity)")
.bind("activity", user.activity)
.bind("user_id", user.id)
.fetch()
.awaitRowsUpdated()
return client.execute("UPDATE users SET value = :value WHERE id = :id")
.bind("value", value)
.bind("id", user.id)
.fetch()
.awaitRowsUpdated()
}
此方法有效,但我想使用数据库事务。 Kotlin 支持吗
好的,我找到了我将其发布在这里的解决方案,以便其他人可以从中受益。我所要做的就是。
@Component
class UserRepository(private val client: DatabaseClient, private val operator: TransactionalOperator) {
suspend fun updateUser(user: User, value: String) =
operator.executeAndAwait {
client.execute("INSERT INTO log(user_id, activity) VALUES (:user_id, :activity)")
.bind("activity", user.activity)
.bind("user_id", user.id)
.await()
client.execute("UPDATE users SET value = :value WHERE id = :id")
.bind("value", value)
.bind("id", user.id)
.await()
}
}