LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-21

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をご参照ください。

おまけ

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0