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

posted at

updated at

Organization

【SpringWebflux】トランザクション単位で一意な値を設定する/取得する【R2DBC】

TL;DR

  • TransactionSynchronizationManager.forCurrentTransactionで、現在のコンテキストに対するTransactionSynchronizationManagerを取得できる
  • TransactionSynchronizationManagerにはリソースをバインドできる
    • ただし、key/value共にnullは設定不可

やり方

基本操作は以下の通りです。
サンプルコードはKotlinになっていますが、操作そのものはJavaもほぼ同じです。

import org.springframework.transaction.reactive.TransactionSynchronizationManager
import reactor.core.publisher.Mono

val key: Any = /* 文字列など、任意の非nullキー */
val value: Any = /* トランザクション内で一意にしたい任意の非null値 */

// トランザクション非開始時はエラーになる
val manager: Mono<TransactionSynchronizationManager> = TransactionSynchronizationManager.forCurrentTransaction()

// 値の設定(keyに対して既に値がバインドされているとエラーになる)
manager.doOnNext { bindResource(key, value) }

// 値の読み出し(バインドされていなければnullになる)
val readValue: Mono<Any> = manager.map { getResource(key) ?: throw RuntimeException("値が取得できませんでした") }

TransactionSynchronizationManagerに関する詳しい情報はJavadocをご参照ください。

おまけ

自分が考えていた利用例です。

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?