public class DataSourceTransactionManager extends AbstractPlatformTransactionManager implements ResourceTransactionManager, InitializingBean
DataSource
SE の PlatformTransactionManager
実装。このクラスは、セットアップで javax.sql.DataSource
を Connection
ファクトリメカニズムとして使用する限り、任意の JDBC ドライバーを備えた任意の環境で動作できます。指定された DataSource
から現在のスレッドに JDBC Connection
をバインドします。これにより、DataSource
ごとに 1 つのスレッドバインド Connection
が可能になる可能性があります。 注: このトランザクションマネージャーが動作する DataSource
は、独立した Connection
を返す必要があります。Connection
は通常、接続プールから取得されますが、DataSource
は、特にスコープ指定された、または制約された Connection
を返してはなりません。このトランザクションマネージャーは、指定された伝播動作に従って、Connection
をスレッドバインドされたトランザクションに関連付けます。トランザクションの進行中であっても、個別の独立した Connection
を取得できることを前提としています。
標準の EE スタイルの DataSource.getConnection()
SE 呼び出しではなく、DataSourceUtils.getConnection(DataSource)
経由で JDBC Connection
を取得するには、アプリケーションコードが必要です。JdbcTemplate
などの Spring クラスは、この戦略を暗黙的に使用します。このトランザクションマネージャーと組み合わせて使用しない場合、DataSourceUtils
ルックアップ戦略はネイティブ DataSource
ルックアップとまったく同じように動作します。持ち運び可能な方法で使用できます。
あるいは、Spring をまったく認識しないレガシーコードなど、アプリケーションコードが標準 EE スタイルの検索パターン DataSource.getConnection()
SE で動作するようにすることもできます。その場合、ターゲット DataSource
の TransactionAwareDataSourceProxy
を定義し、そのプロキシ DataSource
を DAO に渡します。これにより、アクセス時に Spring が管理するトランザクションに自動的に参加します。
カスタム分離レベルと、適切な JDBC ステートメントのタイムアウトとして適用されるタイムアウトをサポートします。後者をサポートするには、アプリケーションコードで JdbcTemplate
を使用するか、作成された JDBC Statement
ごとに DataSourceUtils.applyTransactionTimeout(java.sql.Statement, javax.sql.DataSource)
を呼び出すか、タイムアウトを認識する JDBC Connection
および Statement
を自動的に作成する TransactionAwareDataSourceProxy
を経由する必要があります。
ターゲット DataSource
の LazyConnectionDataSourceProxy
を定義し、このトランザクションマネージャーと DAO の両方を指すようにすることを検討してください。これにより、「空の」トランザクション、つまり JDBC ステートメントが実行されないトランザクションの処理が最適化されます。LazyConnectionDataSourceProxy
は、Statement
が実行されるまで、ターゲット DataSource
から実際の JDBC Connection
をフェッチせず、指定されたトランザクション設定をターゲット Connection
に遅延適用します。
このトランザクションマネージャーは、JDBC 3.0 Savepoint
SE メカニズムを介してネストされたトランザクションをサポートします。ネストされたトランザクションは、セーブポイントをサポートする JDBC ドライバー(Oracle JDBC ドライバーなど)に制限なく機能するため、"nestedTransactionAllowed"
フラグのデフォルトは "true" です。
このトランザクションマネージャーは、JTA をサポートするコンテナーを必要としないため、単一リソースの場合の JtaTransactionManager
の代替として使用でき、通常はローカルに定義された JDBC DataSource
(Hikari 接続プールなど) と組み合わせて使用できます。このローカル戦略と JTA 環境の間の切り替えは、設定の問題だけです。
4.3.4 の時点で、このトランザクションマネージャーは、基になる JDBC Connection
で動作するリソースを想定して、登録されたトランザクション同期でフラッシュコールバックをトリガーします(同期が一般的にアクティブな場合)。これにより、特に遅延登録された ORM リソース(例: Hibernate Session
)に関して、JtaTransactionManager
に類似したセットアップが可能になります。
NOTE: 5.3 の時点で、JdbcTransactionManager
は、JdbcTemplate
に合わせて、コミット / ロールバック例外変換を含む拡張サブクラスとして使用できます。
AbstractPlatformTransactionManager.setNestedTransactionAllowed(boolean)
, Savepoint
SE, DataSourceUtils.getConnection(javax.sql.DataSource)
, DataSourceUtils.applyTransactionTimeout(java.sql.Statement, javax.sql.DataSource)
, DataSourceUtils.releaseConnection(java.sql.Connection, javax.sql.DataSource)
, TransactionAwareDataSourceProxy
, LazyConnectionDataSourceProxy
, JdbcTemplate
, JdbcTransactionManager
, 直列化された形式 AbstractPlatformTransactionManager.SuspendedResourcesHolder
logger, SYNCHRONIZATION_ALWAYS, SYNCHRONIZATION_NEVER, SYNCHRONIZATION_ON_ACTUAL_TRANSACTION
コンストラクターと説明 |
---|
DataSourceTransactionManager() 新しい DataSourceTransactionManager インスタンスを作成します。 |
DataSourceTransactionManager(DataSourceSE dataSource) 新しい DataSourceTransactionManager インスタンスを作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() |
protected void | doBegin(ObjectSE transaction, TransactionDefinition definition) 指定されたトランザクション定義に従って、セマンティクスで新しいトランザクションを開始します。 |
protected void | doCleanupAfterCompletion(ObjectSE transaction) トランザクション完了後にリソースをクリーンアップします。 |
protected void | doCommit(DefaultTransactionStatus status) 指定されたトランザクションの実際のコミットを実行します。 |
protected ObjectSE | doGetTransaction() 現在のトランザクション状態のトランザクションオブジェクトを返します。 |
protected void | doResume(ObjectSE transaction, ObjectSE suspendedResources) 現在のトランザクションのリソースを再開します。 |
protected void | doRollback(DefaultTransactionStatus status) 指定されたトランザクションの実際のロールバックを実行します。 |
protected void | doSetRollbackOnly(DefaultTransactionStatus status) 指定されたトランザクションをロールバックのみに設定します。 |
protected ObjectSE | doSuspend(ObjectSE transaction) 現在のトランザクションのリソースを一時停止します。 |
DataSourceSE | getDataSource() このインスタンスがトランザクションを管理する JDBC DataSource を返します。 |
ObjectSE | getResourceFactory() このトランザクションマネージャーが動作するリソースファクトリを返します。 |
boolean | isEnforceReadOnly() トランザクション接続で明示的なステートメントを使用して、トランザクションの読み取り専用の性質を強制するかどうかを返します。 |
protected boolean | isExistingTransaction(ObjectSE transaction) 指定されたトランザクションオブジェクトが既存のトランザクション(つまり、すでに開始されているトランザクション)を示しているかどうかを確認します。 |
protected DataSourceSE | obtainDataSource() DataSource を入手して実際に使用してください。 |
protected void | prepareTransactionalConnection(ConnectionSE con, TransactionDefinition definition) トランザクション開始直後にトランザクション Connection を準備します。 |
void | setDataSource(DataSourceSE dataSource) このインスタンスがトランザクションを管理する必要がある JDBC DataSource を設定します。 |
void | setEnforceReadOnly(boolean enforceReadOnly) トランザクション接続の明示的なステートメント(Oracle、MySQL、Postgres で理解される "SETTRANSACTION READ ONLY" )を使用して、トランザクションの読み取り専用の性質( TransactionDefinition.isReadOnly() で示される)を強制するかどうかを指定します。 |
protected RuntimeExceptionSE | translateException(StringSE task, SQLExceptionSE ex) 指定された JDBC コミット / ロールバック例外を一般的な Spring 例外に変換して、 AbstractPlatformTransactionManager.commit(org.springframework.transaction.TransactionStatus) /AbstractPlatformTransactionManager.rollback(org.springframework.transaction.TransactionStatus) 呼び出しから伝播します。 |
commit, determineTimeout, getDefaultTimeout, getTransaction, getTransactionSynchronization, invokeAfterCompletion, isFailEarlyOnGlobalRollbackOnly, isGlobalRollbackOnParticipationFailure, isNestedTransactionAllowed, isRollbackOnCommitFailure, isValidateExistingTransaction, newTransactionStatus, prepareForCommit, prepareSynchronization, prepareTransactionStatus, registerAfterCompletionWithExistingTransaction, resume, rollback, setDefaultTimeout, setFailEarlyOnGlobalRollbackOnly, setGlobalRollbackOnParticipationFailure, setNestedTransactionAllowed, setRollbackOnCommitFailure, setTransactionSynchronization, setTransactionSynchronizationName, setValidateExistingTransaction, shouldCommitOnGlobalRollbackOnly, suspend, triggerBeforeCommit, triggerBeforeCompletion, useSavepointForNestedTransaction
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
commit, getTransaction, rollback
public DataSourceTransactionManager()
DataSourceTransactionManager
インスタンスを作成します。DataSource
を使用するには、DataSource
を設定する必要があります。public DataSourceTransactionManager(DataSourceSE dataSource)
DataSourceTransactionManager
インスタンスを作成します。dataSource
- トランザクションを管理する JDBC DataSourcepublic void setDataSource(@Nullable DataSourceSE dataSource)
DataSource
を設定します。 これは通常、ローカルに定義された DataSource
、たとえば Hikari 接続プールになります。あるいは、JNDI からフェッチされた非 XA DataSource
のトランザクションを管理することもできます。XA DataSource
の場合は、代わりに JtaTransactionManager
を使用してください。
ここで指定する DataSource
は、TransactionAwareDataSourceProxy
ではなく、トランザクションを管理するターゲット DataSource
である必要があります。TransactionAwareDataSourceProxy
ではデータアクセスコードのみが動作しますが、トランザクションマネージャーは基礎となるターゲット DataSource
で動作する必要があります。それでも TransactionAwareDataSourceProxy
が渡された場合は、そのターゲット DataSource
を抽出するためにラップが解除されます。
ここで渡される DataSource
は、独立した Connection
を返す必要があります。Connection
は通常、接続プールから取得されますが、DataSource
は、遅延フェッチされる可能性があるだけで、特にスコープ指定または制約された Connection
を返すことはできません。
@Nullable public DataSourceSE getDataSource()
DataSource
を返します。protected DataSourceSE obtainDataSource()
DataSource
を入手して実際に使用してください。null
)IllegalStateExceptionSE
- DataSource セットがない場合 public void setEnforceReadOnly(boolean enforceReadOnly)
TransactionDefinition.isReadOnly()
で示される)を強制するかどうかを指定します。 接続で実行される SQL ステートメントを含む正確な処理は、prepareTransactionalConnection(java.sql.Connection, org.springframework.transaction.TransactionDefinition)
を使用してカスタマイズできます。
この読み取り専用処理モードは、Spring がデフォルトで適用する Connection.setReadOnly(boolean)
SE ヒントを超えています。その標準 JDBC ヒントとは対照的に、"SET TRANSACTION READ ONLY" は、データ操作ステートメントが厳密に許可されない分離レベルのような接続モードを強制します。また、Oracle では、この読み取り専用モードはトランザクション全体の読み取り一貫性を提供します。
古い Oracle JDBC ドライバ (9i, 10g) では、Connection.setReadOnly(true
でもこの読み取り専用モードが強制されていました。ただし、最近のドライバでは、この強力な強制は、このフラグなどで明示的に適用する必要があります。
public boolean isEnforceReadOnly()
setEnforceReadOnly(boolean)
public void afterPropertiesSet()
InitializingBean
BeanFactoryAware
、ApplicationContextAware
などを満たした後、包含 BeanFactory
によって呼び出されます。このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されたときに、その全体的な構成の検証と最終的な初期化を実行できます。
InitializingBean
の afterPropertiesSet
public ObjectSE getResourceFactory()
ResourceTransactionManager
このターゲットリソースファクトリは、通常、スレッドごとの TransactionSynchronizationManager
のリソースバインディングのリソースキーとして使用されます。
ResourceTransactionManager
の getResourceFactory
null
)TransactionSynchronizationManager.bindResource(java.lang.Object, java.lang.Object)
, TransactionSynchronizationManager.getResource(java.lang.Object)
protected ObjectSE doGetTransaction()
AbstractPlatformTransactionManager
返されるオブジェクトは通常、具体的なトランザクションマネージャーの実装に固有であり、対応するトランザクション状態を変更可能な形で保持します。このオブジェクトは、直接または DefaultTransactionStatus インスタンスの一部として、他のテンプレートメソッド(doBegin や doCommit など)に渡されます。
返されるオブジェクトには、既存のトランザクション、つまり、トランザクションマネージャーでの現在の getTransaction
呼び出しの前にすでに開始されているトランザクションに関する情報が含まれている必要があります。その結果、doGetTransaction
実装は通常、既存のトランザクションを探し、返されたトランザクションオブジェクトに対応する状態を格納します。
AbstractPlatformTransactionManager
の doGetTransaction
AbstractPlatformTransactionManager.doBegin(java.lang.Object, org.springframework.transaction.TransactionDefinition)
, AbstractPlatformTransactionManager.doCommit(org.springframework.transaction.support.DefaultTransactionStatus)
, AbstractPlatformTransactionManager.doRollback(org.springframework.transaction.support.DefaultTransactionStatus)
, DefaultTransactionStatus.getTransaction()
protected boolean isExistingTransaction(ObjectSE transaction)
AbstractPlatformTransactionManager
結果は、新しいトランザクションに対して指定された伝播動作に従って評価されます。既存のトランザクションが中断される(PROPAGATION_REQUIRES_NEW の場合)か、新しいトランザクションが既存のトランザクションに参加する可能性があります(PROPAGATION_REQUIRED の場合)。
デフォルト実装は false
を返しますが、既存のトランザクションへの参加は一般にサポートされていないと想定しています。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
AbstractPlatformTransactionManager
の isExistingTransaction
transaction
- doGetTransaction によって返されるトランザクションオブジェクト AbstractPlatformTransactionManager.doGetTransaction()
protected void doBegin(ObjectSE transaction, TransactionDefinition definition)
AbstractPlatformTransactionManager
このメソッドは、トランザクションマネージャーが実際に新しいトランザクションを開始することを決定したときに呼び出されます。以前にトランザクションがなかったか、前のトランザクションが中断されています。
特別なシナリオは、セーブポイントのないネストされたトランザクションです: useSavepointForNestedTransaction()
が "false" を返す場合、このメソッドは、必要に応じてネストされたトランザクションを開始するために呼び出されます。このようなコンテキストでは、アクティブなトランザクションがあります。このメソッドの実装はこれを検出し、適切なネストされたトランザクションを開始する必要があります。
AbstractPlatformTransactionManager
の doBegin
transaction
- doGetTransaction
によって返されるトランザクションオブジェクト definition
- 伝播動作、分離レベル、読み取り専用フラグ、タイムアウト、トランザクション名を記述する TransactionDefinition インスタンス protected ObjectSE doSuspend(ObjectSE transaction)
AbstractPlatformTransactionManager
トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
AbstractPlatformTransactionManager
の doSuspend
transaction
- doGetTransaction
によって返されるトランザクションオブジェクト AbstractPlatformTransactionManager.doResume(java.lang.Object, java.lang.Object)
protected void doResume(@Nullable ObjectSE transaction, ObjectSE suspendedResources)
AbstractPlatformTransactionManager
トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
AbstractPlatformTransactionManager
の doResume
transaction
- doGetTransaction
によって返されるトランザクションオブジェクト suspendedResources
- doSuspend によって返される、中断されたリソースを保持するオブジェクト AbstractPlatformTransactionManager.doSuspend(java.lang.Object)
protected void doCommit(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
実装では、「新規トランザクション」フラグまたはロールバック専用フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートコミットが実行されます。
AbstractPlatformTransactionManager
の doCommit
status
- トランザクションのステータス表現 DefaultTransactionStatus.getTransaction()
protected void doRollback(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
実装では、「新しいトランザクション」フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートロールバックが実行されます。
AbstractPlatformTransactionManager
の doRollback
status
- トランザクションのステータス表現 DefaultTransactionStatus.getTransaction()
protected void doSetRollbackOnly(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
既存のトランザクションへの参加は一般にサポートされていないと想定して、デフォルトの実装は IllegalTransactionStateException をスローします。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
AbstractPlatformTransactionManager
の doSetRollbackOnly
status
- トランザクションのステータス表現 protected void doCleanupAfterCompletion(ObjectSE transaction)
AbstractPlatformTransactionManager
doCommit
および doRollback
の実行後に、結果について呼び出されます。デフォルトの実装は何もしません。
例外をスローするべきではなく、エラーに対して警告を発行するだけです。
AbstractPlatformTransactionManager
の doCleanupAfterCompletion
transaction
- doGetTransaction
によって返されるトランザクションオブジェクト protected void prepareTransactionalConnection(ConnectionSE con, TransactionDefinition definition) throws SQLExceptionSE
Connection
を準備します。"enforceReadOnly"
フラグが true
に設定され、トランザクション定義が読み取り専用トランザクションを示している場合、デフォルトの実装は "SET TRANSACTION READ ONLY" ステートメントを実行します。
"SET TRANSACTION READ ONLY" は Oracle、MySQL、Postgres によって理解され、他のデータベースでも機能する場合があります。この処理を適用する場合は、それに応じてこのメソッドをオーバーライドします。
con
- トランザクション JDBC 接続 definition
- 現在のトランザクション定義 SQLExceptionSE
- JDBC API によってスローされた場合 setEnforceReadOnly(boolean)
protected RuntimeExceptionSE translateException(StringSE task, SQLExceptionSE ex)
AbstractPlatformTransactionManager.commit(org.springframework.transaction.TransactionStatus)
/AbstractPlatformTransactionManager.rollback(org.springframework.transaction.TransactionStatus)
呼び出しから伝播します。 デフォルトの実装は TransactionSystemException
をスローします。サブクラスは、並行性の失敗などを明確に識別する場合があります。
task
- タスクの説明 (コミットまたはロールバック)ex
- コミット / ロールバックからスローされる SQLExceptionDataAccessException
または TransactionException