0
Help us understand the problem. What are the problem?

posted at

updated at

Organization

【SpringWebflux/Kotlin】手動でトランザクションを有効にして処理を行う【R2DBC】

TL;DR

  • TransactionalOperator.transactionalを使うと簡単
    • 処理の中でのsuspend関数呼び出しはmono関数でラップするのが簡単

やり方

サンプルコードは以下の通りです。

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.reactor.awaitSingle
import kotlinx.coroutines.reactor.mono
import org.springframework.stereotype.Component
import org.springframework.transaction.reactive.TransactionalOperator

@Component
class TransactionOperation(private val transactionalOperator: TransactionalOperator) {
    // 中にそのまま処理を書く場合
    suspend fun operation() {
        transactionalOperator
            .transactional(
                mono {
                    /* ここにやりたい処理(DBアクセスを行うsuspend関数の呼び出しなど)を書く */
                }
            ).awaitSingle()
    }

    // 外から処理を渡す場合
    suspend operator fun <T> invoke(block: suspend CoroutineScope.() -> T): T = transactionalOperator
        .transactional(mono(block = block))
        .awaitSingle()
}
「外から処理を渡す場合」の利用例
transactionOperation {
    /* ここにやりたい処理(DBアクセスを行うsuspend関数の呼び出しなど)を書く */
}

以下、このコードに関する解説を書きます。

TransactionalOperatorの取得について

TransactionalOperatorは、自分の環境ではAutowireして利用できました。
また、ReactiveTransactionManagerから生成することもできます

内部処理の書き方について

TransactionalOperatorを用いた処理は、低レベルAPIに触れずに済む分Mono/Fluxを渡すやりの方が扱いやすいと思います。
特に「外から処理を渡す場合」として紹介した方法は、普通にsuspend関数を書くのと同じように利用することができるため、扱いやすいです。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?