【问题标题】:DB transaction using R2BC Kotlin coroutine使用 R2BC Kotlin 协程的数据库事务
【发布时间】:2020-02-15 14:39:27
【问题描述】:

我在带有 Kotlin 的 Spring Webflux 项目中使用 R2bc。它运行良好。但是我有这个方法

@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()
}

此方法有效,但我想使用 DB 事务。 Kotlin 是否支持它。

【问题讨论】:

  • 你为什么使用数据库客户端而不是 spring-data 存储库?
  • 因为我需要用一种方法管理多个实体。这是一个非常简化的版本,涉及的内容很少。但我们确实在最简单的用例中使用 R2BC 存储库。
  • 因为这个 awaitRowsUpdated 被阻塞了
  • 即使您从挂起的方法调用。我不这么认为,你能给我举个例子吗?

标签: kotlin reactive-programming spring-webflux reactive kotlin-coroutines


【解决方案1】:

好的,我找到了我在此处发布的解决方案,以便其他人可以从中受益。我所要做的就是。

@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()
        }

}
猜你喜欢
  • 2020-10-12
  • 2021-12-08
  • 2019-08-07
  • 2020-12-29
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
相关资源
最近更新 更多