public class R2dbcTransactionManager extends AbstractReactiveTransactionManager implements InitializingBean
ConnectionFactory
の ReactiveTransactionManager
実装。このクラスは、セットアップで Connection
ファクトリメカニズムとして ConnectionFactory
を使用している限り、任意の R2DBC ドライバーを使用する任意の環境で機能します。R2DBC Connection
を指定された ConnectionFactory
から現在のサブスクライバーコンテキストにバインドし、ConnectionFactory
ごとに 1 つのコンテキストバインド Connection
を許可する可能性があります。 注: このトランザクションマネージャーが動作する ConnectionFactory
は、独立した Connection
を返す必要があります。Connection
はプールから取得できますが(一般的なケース)、ConnectionFactory
はスコープスコープの Connection
などを返してはなりません。このトランザクションマネージャーは、指定された伝播動作に従って、Connection
をコンテキストバインドされたトランザクション自体に関連付けます。進行中のトランザクション中でも、個別の独立した Connection
を取得できることを前提としています。
標準の R2DBC スタイルの ConnectionFactory.create()
呼び出しではなく、ConnectionFactoryUtils.getConnection(ConnectionFactory)
を介して R2DBC 接続を取得するには、アプリケーションコードが必要です。DatabaseClient
などの Spring クラスは、この戦略を暗黙的に使用します。このトランザクションマネージャーと組み合わせて使用しない場合、ConnectionFactoryUtils
ルックアップ戦略はネイティブ ConnectionFactory
ルックアップとまったく同じように動作します。ポータブルな方法で使用できます。
または、アプリケーションコードが標準の R2DBC ルックアップパターン ConnectionFactory.create()
で動作するようにすることもできます。たとえば、Spring をまったく認識しないコードの場合です。その場合、ターゲット ConnectionFactory
の TransactionAwareConnectionFactoryProxy
を定義し、そのプロキシ ConnectionFactory
を DAO に渡します。DAO は、アクセス時に Spring 管理のトランザクションに自動的に参加します。
このトランザクションマネージャーは、基盤となる R2DBC Connection
で動作しているリソースを想定して、登録されたトランザクション同期でフラッシュコールバックをトリガーします(同期が一般的にアクティブな場合)。
AbstractReactiveTransactionManager.SuspendedResourcesHolder
logger
コンストラクターと説明 |
---|
R2dbcTransactionManager() 新しい R2dbcTransactionManager インスタンスを作成します。 |
R2dbcTransactionManager(io.r2dbc.spi.ConnectionFactory connectionFactory) 新しい R2dbcTransactionManager インスタンスを作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() |
protected DurationSE | determineTimeout(TransactionDefinition definition) 特定の定義に使用する実際のタイムアウトを決定します。 |
protected reactor.core.publisher.Mono<VoidSE> | doBegin(TransactionSynchronizationManager synchronizationManager, ObjectSE transaction, TransactionDefinition definition) 指定されたトランザクション定義に従って、セマンティクスで新しいトランザクションを開始します。 |
protected reactor.core.publisher.Mono<VoidSE> | doCleanupAfterCompletion(TransactionSynchronizationManager synchronizationManager, ObjectSE transaction) トランザクション完了後にリソースをクリーンアップします。 |
protected reactor.core.publisher.Mono<VoidSE> | doCommit(TransactionSynchronizationManager TransactionSynchronizationManager, GenericReactiveTransaction status) 指定されたトランザクションの実際のコミットを実行します。 |
protected ObjectSE | doGetTransaction(TransactionSynchronizationManager synchronizationManager) 現在のトランザクション状態のトランザクションオブジェクトを返します。 |
protected reactor.core.publisher.Mono<VoidSE> | doResume(TransactionSynchronizationManager synchronizationManager, ObjectSE transaction, ObjectSE suspendedResources) 現在のトランザクションのリソースを再開します。 |
protected reactor.core.publisher.Mono<VoidSE> | doRollback(TransactionSynchronizationManager TransactionSynchronizationManager, GenericReactiveTransaction status) 指定されたトランザクションの実際のロールバックを実行します。 |
protected reactor.core.publisher.Mono<VoidSE> | doSetRollbackOnly(TransactionSynchronizationManager synchronizationManager, GenericReactiveTransaction status) 指定されたトランザクションをロールバックのみに設定します。 |
protected reactor.core.publisher.Mono<ObjectSE> | doSuspend(TransactionSynchronizationManager synchronizationManager, ObjectSE transaction) 現在のトランザクションのリソースを一時停止します。 |
io.r2dbc.spi.ConnectionFactory | getConnectionFactory() このインスタンスがトランザクションを管理する R2DBC ConnectionFactory を返します。 |
boolean | isEnforceReadOnly() トランザクション接続で明示的なステートメントを使用して、トランザクションの読み取り専用の性質を強制するかどうかを返します。 |
protected boolean | isExistingTransaction(ObjectSE transaction) 指定されたトランザクションオブジェクトが既存のトランザクション(つまり、すでに開始されているトランザクション)を示しているかどうかを確認します。 |
protected io.r2dbc.spi.ConnectionFactory | obtainConnectionFactory() ConnectionFactory を入手して実際に使用してください。 |
protected reactor.core.publisher.Mono<VoidSE> | prepareTransactionalConnection(io.r2dbc.spi.Connection con, TransactionDefinition definition, ObjectSE transaction) トランザクション開始直後にトランザクション Connection を準備します。 |
protected io.r2dbc.spi.IsolationLevel | resolveIsolationLevel(int isolationLevel) 分離レベル定数を R2DBC IsolationLevel に解決します。 |
void | setConnectionFactory(io.r2dbc.spi.ConnectionFactory connectionFactory) このインスタンスがトランザクションを管理する必要がある R2DBC ConnectionFactory を設定します。 |
void | setEnforceReadOnly(boolean enforceReadOnly) トランザクションの読み取り専用の性質を強制するかどうかを指定します(トランザクション接続の明示的なステートメントを通じて TransactionDefinition.isReadOnly() で示されるように: Oracle、MySQL、Postgres が理解できる "SET TRANSACTION READ ONLY"。 |
protected RuntimeExceptionSE | translateException(StringSE task, io.r2dbc.spi.R2dbcException ex) 指定された R2DBC コミット / ロールバック例外を一般的な Spring 例外に変換して、 AbstractReactiveTransactionManager.commit(org.springframework.transaction.ReactiveTransaction) /AbstractReactiveTransactionManager.rollback(org.springframework.transaction.ReactiveTransaction) 呼び出しから伝達します。 |
commit, getReactiveTransaction, prepareForCommit, registerAfterCompletionWithExistingTransaction, rollback
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public R2dbcTransactionManager()
R2dbcTransactionManager
インスタンスを作成します。ConnectionFactory を使用するには、ConnectionFactory を設定する必要があります。public R2dbcTransactionManager(io.r2dbc.spi.ConnectionFactory connectionFactory)
R2dbcTransactionManager
インスタンスを作成します。connectionFactory
- トランザクションを管理する R2DBC ConnectionFactorypublic void setConnectionFactory(@Nullable io.r2dbc.spi.ConnectionFactory connectionFactory)
ConnectionFactory
を設定します。 これは通常、接続プールなど、ローカルで定義された ConnectionFactory
になります。
ここで渡される ConnectionFactory
は、独立した Connection
を返す必要があります。Connection
はプールから取得できますが(一般的なケース)、ConnectionFactory
はスコープ付き Connection
などを返してはなりません。
@Nullable public io.r2dbc.spi.ConnectionFactory getConnectionFactory()
ConnectionFactory
を返します。protected io.r2dbc.spi.ConnectionFactory obtainConnectionFactory()
ConnectionFactory
を入手して実際に使用してください。ConnectionFactory
(非 null
)IllegalStateExceptionSE
- ConnectionFactory セットがない場合 public void setEnforceReadOnly(boolean enforceReadOnly)
TransactionDefinition.isReadOnly()
で示されるように: Oracle、MySQL、Postgres が理解できる "SET TRANSACTION READ ONLY"。 接続で実行される SQL ステートメントを含む正確な処理は、prepareTransactionalConnection(io.r2dbc.spi.Connection, org.springframework.transaction.TransactionDefinition, java.lang.Object)
を介してカスタマイズできます。
public boolean isEnforceReadOnly()
public void afterPropertiesSet()
InitializingBean
BeanFactoryAware
、ApplicationContextAware
などを満たした後、包含 BeanFactory
によって呼び出されます。このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されたときに、その全体的な構成の検証と最終的な初期化を実行できます。
InitializingBean
の afterPropertiesSet
protected ObjectSE doGetTransaction(TransactionSynchronizationManager synchronizationManager) throws TransactionException
AbstractReactiveTransactionManager
返されるオブジェクトは通常、具体的なトランザクションマネージャーの実装に固有のものであり、対応するトランザクション状態を変更可能な形式で保持します。このオブジェクトは、他のテンプレートメソッド (doBegin や doCommit など) に直接、または DefaultReactiveTransactionStatus インスタンスの一部として渡されます。
返されるオブジェクトには、既存のトランザクション、つまり、トランザクションマネージャーでの現在の getTransaction
呼び出しの前にすでに開始されているトランザクションに関する情報が含まれている必要があります。その結果、doGetTransaction
実装は通常、既存のトランザクションを探し、返されたトランザクションオブジェクトに対応する状態を格納します。
AbstractReactiveTransactionManager
の doGetTransaction
synchronizationManager
- 現在のトランザクションにバインドされた同期マネージャー CannotCreateTransactionException
- トランザクションサポートが利用できない場合 TransactionException
- ルックアップまたはシステムエラーの場合 AbstractReactiveTransactionManager.doBegin(org.springframework.transaction.reactive.TransactionSynchronizationManager, java.lang.Object, org.springframework.transaction.TransactionDefinition)
, AbstractReactiveTransactionManager.doCommit(org.springframework.transaction.reactive.TransactionSynchronizationManager, org.springframework.transaction.reactive.GenericReactiveTransaction)
, AbstractReactiveTransactionManager.doRollback(org.springframework.transaction.reactive.TransactionSynchronizationManager, org.springframework.transaction.reactive.GenericReactiveTransaction)
, GenericReactiveTransaction.getTransaction()
protected boolean isExistingTransaction(ObjectSE transaction)
AbstractReactiveTransactionManager
結果は、新しいトランザクションに対して指定された伝播動作に従って評価されます。既存のトランザクションが中断される(PROPAGATION_REQUIRES_NEW の場合)か、新しいトランザクションが既存のトランザクションに参加する可能性があります(PROPAGATION_REQUIRED の場合)。
デフォルト実装は false
を返しますが、既存のトランザクションへの参加は一般にサポートされていないと想定しています。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
AbstractReactiveTransactionManager
の isExistingTransaction
transaction
- doGetTransaction によって返されるトランザクションオブジェクト AbstractReactiveTransactionManager.doGetTransaction(org.springframework.transaction.reactive.TransactionSynchronizationManager)
protected reactor.core.publisher.Mono<VoidSE> doBegin(TransactionSynchronizationManager synchronizationManager, ObjectSE transaction, TransactionDefinition definition) throws TransactionException
AbstractReactiveTransactionManager
このメソッドは、トランザクションマネージャーが実際に新しいトランザクションを開始することを決定したときに呼び出されます。以前にトランザクションがなかったか、前のトランザクションが中断されています。
特別なシナリオはネストされたトランザクションです。このメソッドは、必要に応じてネストされたトランザクションを開始するために呼び出されます。このようなコンテキストでは、アクティブなトランザクションがあります。このメソッドの実装はこれを検出し、適切なネストされたトランザクションを開始する必要があります。
AbstractReactiveTransactionManager
の doBegin
synchronizationManager
- 新しいトランザクションにバインドされた同期マネージャー transaction
- doGetTransaction
によって返されるトランザクションオブジェクト definition
- 伝播動作、分離レベル、読み取り専用フラグ、タイムアウト、トランザクション名を記述する TransactionDefinition インスタンス TransactionException
- 作成またはシステムエラーの場合 NestedTransactionNotSupportedException
- 基になるトランザクションがネストをサポートしていない場合 (たとえばセーブポイント経由)protected DurationSE determineTimeout(TransactionDefinition definition)
definition
- トランザクション定義 TransactionDefinition.getTimeout()
protected reactor.core.publisher.Mono<ObjectSE> doSuspend(TransactionSynchronizationManager synchronizationManager, ObjectSE transaction) throws TransactionException
AbstractReactiveTransactionManager
トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
AbstractReactiveTransactionManager
の doSuspend
synchronizationManager
- 現在のトランザクションにバインドされた同期マネージャー transaction
- doGetTransaction
によって返されるトランザクションオブジェクト TransactionSuspensionNotSupportedException
- トランザクションマネージャーの実装が中断をサポートしていない場合 TransactionException
- システムエラーの場合 AbstractReactiveTransactionManager.doResume(org.springframework.transaction.reactive.TransactionSynchronizationManager, java.lang.Object, java.lang.Object)
protected reactor.core.publisher.Mono<VoidSE> doResume(TransactionSynchronizationManager synchronizationManager, @Nullable ObjectSE transaction, ObjectSE suspendedResources) throws TransactionException
AbstractReactiveTransactionManager
トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
AbstractReactiveTransactionManager
の doResume
synchronizationManager
- 現在のトランザクションにバインドされた同期マネージャー transaction
- doGetTransaction
によって返されるトランザクションオブジェクト suspendedResources
- doSuspend によって返される、中断されたリソースを保持するオブジェクト TransactionSuspensionNotSupportedException
- トランザクションマネージャーの実装が中断をサポートしていない場合 TransactionException
- システムエラーの場合 AbstractReactiveTransactionManager.doSuspend(org.springframework.transaction.reactive.TransactionSynchronizationManager, java.lang.Object)
protected reactor.core.publisher.Mono<VoidSE> doCommit(TransactionSynchronizationManager TransactionSynchronizationManager, GenericReactiveTransaction status) throws TransactionException
AbstractReactiveTransactionManager
実装では、「新規トランザクション」フラグまたはロールバック専用フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートコミットが実行されます。
AbstractReactiveTransactionManager
の doCommit
TransactionSynchronizationManager
- 現在のトランザクションにバインドされた同期マネージャー status
- トランザクションのステータス表現 TransactionException
- コミットまたはシステムエラーの場合 GenericReactiveTransaction.getTransaction()
protected reactor.core.publisher.Mono<VoidSE> doRollback(TransactionSynchronizationManager TransactionSynchronizationManager, GenericReactiveTransaction status) throws TransactionException
AbstractReactiveTransactionManager
実装では、「新しいトランザクション」フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートロールバックが実行されます。
AbstractReactiveTransactionManager
の doRollback
TransactionSynchronizationManager
- 現在のトランザクションにバインドされた同期マネージャー status
- トランザクションのステータス表現 TransactionException
- システムエラーの場合 GenericReactiveTransaction.getTransaction()
protected reactor.core.publisher.Mono<VoidSE> doSetRollbackOnly(TransactionSynchronizationManager synchronizationManager, GenericReactiveTransaction status) throws TransactionException
AbstractReactiveTransactionManager
既存のトランザクションへの参加は一般にサポートされていないと想定して、デフォルトの実装は IllegalTransactionStateException をスローします。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
AbstractReactiveTransactionManager
の doSetRollbackOnly
synchronizationManager
- 現在のトランザクションにバインドされた同期マネージャー status
- トランザクションのステータス表現 TransactionException
- システムエラーの場合 protected reactor.core.publisher.Mono<VoidSE> doCleanupAfterCompletion(TransactionSynchronizationManager synchronizationManager, ObjectSE transaction)
AbstractReactiveTransactionManager
doCommit
および doRollback
の実行後に、結果について呼び出されます。デフォルトの実装は何もしません。
例外をスローするべきではなく、エラーに対して警告を発行するだけです。
AbstractReactiveTransactionManager
の doCleanupAfterCompletion
synchronizationManager
- 現在のトランザクションにバインドされた同期マネージャー transaction
- doGetTransaction
によって返されるトランザクションオブジェクト protected reactor.core.publisher.Mono<VoidSE> prepareTransactionalConnection(io.r2dbc.spi.Connection con, TransactionDefinition definition, ObjectSE transaction)
Connection
を準備します。"enforceReadOnly"
フラグが true
に設定され、トランザクション定義が読み取り専用トランザクションを示している場合、デフォルトの実装は "SET TRANSACTION READ ONLY" ステートメントを実行します。
"SET TRANSACTION READ ONLY" は Oracle、MySQL、Postgres によって理解され、他のデータベースでも機能する場合があります。この処理を適用する場合は、それに応じてこのメソッドをオーバーライドします。
con
- トランザクション R2DBC 接続 definition
- 現在のトランザクション定義 transaction
- トランザクションオブジェクト setEnforceReadOnly(boolean)
@Nullable protected io.r2dbc.spi.IsolationLevel resolveIsolationLevel(int isolationLevel)
IsolationLevel
に解決します。ベンダー固有の IsolationLevel
の分離レベル変換を継承する場合は、それに応じてこのメソッドをオーバーライドします。isolationLevel
- 変換する分離レベル。default
のままにする必要がある場合は、null
にすることができます。TransactionDefinition.getIsolationLevel()
protected RuntimeExceptionSE translateException(StringSE task, io.r2dbc.spi.R2dbcException ex)
AbstractReactiveTransactionManager.commit(org.springframework.transaction.ReactiveTransaction)
/AbstractReactiveTransactionManager.rollback(org.springframework.transaction.ReactiveTransaction)
呼び出しから伝達します。task
- タスクの説明(コミットまたはロールバック)。ex
- コミット / ロールバックからスローされる SQLException。