Транзакция БД с использованием сопрограммы R2B C Kotlin - PullRequest
0 голосов
/ 15 февраля 2020

Я использую R2b c в проекте Spring Webflux с 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.

1 Ответ

0 голосов
/ 15 февраля 2020

Хорошо, я нашел решение, которое выкладываю здесь, чтобы другие могли извлечь из этого пользу. Все, что мне нужно было сделать, это.

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

}
...