public class DataSourceTransactionManager extends AbstractPlatformTransactionManager implements ResourceTransactionManager, InitializingBean
DataSource
の PlatformTransactionManager
実装。このクラスは、セットアップが Connection
ファクトリメカニズムとして javax.sql.DataSource
を使用している限り、任意の JDBC ドライバーを備えた任意の環境で機能できます。指定された DataSource から現在のスレッドに JDBC 接続をバインドし、DataSource ごとに 1 つのスレッドバインド接続を可能にします。注: このトランザクションマネージャーが操作する DataSource は、独立した Connections を返す必要があります。接続はプールから取得できます(通常の場合)が、DataSource はスレッドスコープ / リクエストスコープの接続などを返すことはできません。このトランザクションマネージャーは、指定された伝播動作に従って、Connections をスレッドバインドトランザクション自体に関連付けます。進行中のトランザクション中でも、独立した独立した接続を取得できると想定しています。
標準の Java EE スタイルの DataSource.getConnection()
呼び出しの代わりに DataSourceUtils.getConnection(DataSource)
を介して JDBC 接続を取得するには、アプリケーションコードが必要です。JdbcTemplate
などの Spring クラスは、この戦略を暗黙的に使用します。このトランザクションマネージャーと組み合わせて使用しない場合、DataSourceUtils
ルックアップ戦略はネイティブ DataSource ルックアップとまったく同じように動作します。携帯用に使用できます。
または、アプリケーションコードが標準の Java EE スタイルのルックアップパターン DataSource.getConnection()
で動作するようにすることもできます。たとえば、Spring をまったく認識しないレガシーコードの場合です。その場合、ターゲット DataSource の TransactionAwareDataSourceProxy
を定義し、そのプロキシ DataSource を DAO に渡します。DAO は、アクセス時に Spring 管理のトランザクションに自動的に参加します。
カスタム分離レベル、および適切な JDBC ステートメントタイムアウトとして適用されるタイムアウトをサポートします。後者をサポートするには、アプリケーションコードは JdbcTemplate
を使用するか、作成された JDBC ステートメントごとに DataSourceUtils.applyTransactionTimeout(java.sql.Statement, javax.sql.DataSource)
を呼び出すか、タイムアウト対応の JDBC 接続とステートメントを自動的に作成する TransactionAwareDataSourceProxy
を実行する必要があります。
ターゲット DataSource の LazyConnectionDataSourceProxy
を定義し、このトランザクションマネージャーと DAO の両方を指すようにすることを検討してください。これにより、「空の」トランザクション、つまり JDBC ステートメントが実行されていないトランザクションの処理が最適化されます。LazyConnectionDataSourceProxy は、Statement が実行されるまでターゲット DataSource から実際の JDBC 接続をフェッチせず、指定されたトランザクション設定をターゲット接続に遅延的に適用します。
このトランザクションマネージャーは、JDBC 3.0 Savepoint
メカニズムを介してネストされたトランザクションをサポートします。ネストされたトランザクションは、セーブポイントをサポートする JDBC ドライバー(Oracle JDBC ドライバーなど)の制限なしで機能するため、"nestedTransactionAllowed"
フラグのデフォルトは "true" です。
このトランザクションマネージャーは、JTA をサポートするコンテナーを必要としないため、単一リソースの場合に JtaTransactionManager
の代わりとして使用できます。通常は、ローカルで定義された JDBC DataSource (Apache Commons DBCP 接続プールなど) と組み合わせて使用します。このローカル戦略と JTA 環境を切り替えるのは、構成の問題だけです。
4.3.4 の時点で、このトランザクションマネージャーは、基になる JDBC Connection
で動作するリソースを想定して、登録されたトランザクション同期でフラッシュコールバックをトリガーします(同期が一般的にアクティブな場合)。これにより、特に遅延登録された ORM リソース(例: Hibernate Session
)に関して、JtaTransactionManager
に類似したセットアップが可能になります。
AbstractPlatformTransactionManager.setNestedTransactionAllowed(boolean)
, Savepoint
, DataSourceUtils.getConnection(javax.sql.DataSource)
, DataSourceUtils.applyTransactionTimeout(java.sql.Statement, javax.sql.DataSource)
, DataSourceUtils.releaseConnection(java.sql.Connection, javax.sql.DataSource)
, TransactionAwareDataSourceProxy
, LazyConnectionDataSourceProxy
, JdbcTemplate
, 連載形式 AbstractPlatformTransactionManager.SuspendedResourcesHolder
logger, SYNCHRONIZATION_ALWAYS, SYNCHRONIZATION_NEVER, SYNCHRONIZATION_ON_ACTUAL_TRANSACTION
コンストラクターと説明 |
---|
DataSourceTransactionManager() 新しい DataSourceTransactionManager インスタンスを作成します。 |
DataSourceTransactionManager(javax.sql.DataSource dataSource) 新しい DataSourceTransactionManager インスタンスを作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() |
protected void | doBegin(java.lang.Object transaction, TransactionDefinition definition) この実装は分離レベルを設定しますが、タイムアウトは無視します。 |
protected void | doCleanupAfterCompletion(java.lang.Object transaction) トランザクション完了後にリソースをクリーンアップします。 |
protected void | doCommit(DefaultTransactionStatus status) 指定されたトランザクションの実際のコミットを実行します。 |
protected java.lang.Object | doGetTransaction() 現在のトランザクション状態のトランザクションオブジェクトを返します。 |
protected void | doResume(java.lang.Object transaction, java.lang.Object suspendedResources) 現在のトランザクションのリソースを再開します。 |
protected void | doRollback(DefaultTransactionStatus status) 指定されたトランザクションの実際のロールバックを実行します。 |
protected void | doSetRollbackOnly(DefaultTransactionStatus status) 指定されたトランザクションをロールバックのみに設定します。 |
protected java.lang.Object | doSuspend(java.lang.Object transaction) 現在のトランザクションのリソースを一時停止します。 |
javax.sql.DataSource | getDataSource() このインスタンスがトランザクションを管理する JDBC DataSource を返します。 |
java.lang.Object | getResourceFactory() このトランザクションマネージャーが動作するリソースファクトリを返します。 |
boolean | isEnforceReadOnly() トランザクション接続で明示的なステートメントを使用して、トランザクションの読み取り専用の性質を強制するかどうかを返します。 |
protected boolean | isExistingTransaction(java.lang.Object transaction) 指定されたトランザクションオブジェクトが既存のトランザクション(つまり、すでに開始されているトランザクション)を示しているかどうかを確認します。 |
protected javax.sql.DataSource | obtainDataSource() 実際に使用するために DataSource を取得します。 |
protected void | prepareTransactionalConnection(java.sql.Connection con, TransactionDefinition definition) トランザクション開始直後にトランザクション Connection を準備します。 |
void | setDataSource(javax.sql.DataSource dataSource) このインスタンスがトランザクションを管理する JDBC DataSource を設定します。 |
void | setEnforceReadOnly(boolean enforceReadOnly) トランザクションの読み取り専用の性質を強制するかどうかを指定します(トランザクション接続の明示的なステートメントを通じて TransactionDefinition.isReadOnly() で示されるように: Oracle、MySQL、Postgres が理解できる "SET TRANSACTION READ ONLY"。 |
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
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
commit, getTransaction, rollback
public DataSourceTransactionManager()
public DataSourceTransactionManager(javax.sql.DataSource dataSource)
dataSource
- トランザクションを管理する JDBC DataSourcepublic void setDataSource(@Nullable javax.sql.DataSource dataSource)
これは通常、ローカルに定義された DataSource (Apache Commons DBCP 接続プールなど) になります。または、JNDI からフェッチされた非 XA J2EE DataSource のトランザクションを実行することもできます。XA DataSource の場合は、JtaTransactionManager を使用します。
ここで指定する DataSource は、TransactionAwareDataSourceProxy ではなく、トランザクションを管理するターゲット DataSource である必要があります。データアクセスコードのみが TransactionAwareDataSourceProxy で機能しますが、トランザクションマネージャーは基になるターゲット DataSource で機能する必要があります。それでも TransactionAwareDataSourceProxy が渡された場合、ターゲット DataSource を抽出するためにラップ解除されます。
ここで渡された DataSource は、独立した Connections を返す必要があります。接続はプールから取得できます(通常の場合)が、DataSource はスレッドスコープ / リクエストスコープの接続などを返すことはできません。
@Nullable public javax.sql.DataSource getDataSource()
protected javax.sql.DataSource obtainDataSource()
null
)java.lang.IllegalStateException
- DataSource セットがない場合 public void setEnforceReadOnly(boolean enforceReadOnly)
TransactionDefinition.isReadOnly()
で示されるように: Oracle、MySQL、Postgres が理解できる "SET TRANSACTION READ ONLY"。 接続で実行される SQL ステートメントを含む正確な処理は、prepareTransactionalConnection(java.sql.Connection, org.springframework.transaction.TransactionDefinition)
を介してカスタマイズできます。
この読み取り専用処理のモードは、Spring がデフォルトで適用する Connection.setReadOnly(boolean)
ヒントを超えています。その標準の 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 java.lang.Object getResourceFactory()
ResourceTransactionManager
このターゲットリソースファクトリは、通常、スレッドごとの TransactionSynchronizationManager
のリソースバインディングのリソースキーとして使用されます。
ResourceTransactionManager
の getResourceFactory
null
)TransactionSynchronizationManager.bindResource(java.lang.Object, java.lang.Object)
, TransactionSynchronizationManager.getResource(java.lang.Object)
protected java.lang.Object doGetTransaction()
AbstractPlatformTransactionManager
返されるオブジェクトは通常、具体的なトランザクションマネージャーの実装に固有のものであり、対応するトランザクション状態を変更可能な形式で保持します。このオブジェクトは、他のテンプレートメソッド (doBegin や doCommit など) に直接、または DefaultTransactionStatus インスタンスの一部として渡されます。
返されるオブジェクトには、既存のトランザクション、つまり、トランザクションマネージャーでの現在の 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(java.lang.Object transaction)
AbstractPlatformTransactionManager
結果は、新しいトランザクションに対して指定された伝播動作に従って評価されます。既存のトランザクションが中断される(PROPAGATION_REQUIRES_NEW の場合)か、新しいトランザクションが既存のトランザクションに参加する可能性があります(PROPAGATION_REQUIRED の場合)。
デフォルト実装は false
を返しますが、既存のトランザクションへの参加は一般にサポートされていないと想定しています。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
AbstractPlatformTransactionManager
の isExistingTransaction
transaction
- doGetTransaction によって返されるトランザクションオブジェクト AbstractPlatformTransactionManager.doGetTransaction()
protected void doBegin(java.lang.Object transaction, TransactionDefinition definition)
AbstractPlatformTransactionManager
の doBegin
transaction
- doGetTransaction
によって返されたトランザクションオブジェクト definition
- 伝播動作、分離レベル、読み取り専用フラグ、タイムアウト、トランザクション名を記述する TransactionDefinition インスタンス protected java.lang.Object doSuspend(java.lang.Object transaction)
AbstractPlatformTransactionManager
トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
AbstractPlatformTransactionManager
の doSuspend
transaction
- doGetTransaction
によって返されたトランザクションオブジェクト AbstractPlatformTransactionManager.doResume(java.lang.Object, java.lang.Object)
protected void doResume(@Nullable java.lang.Object transaction, java.lang.Object 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(java.lang.Object transaction)
AbstractPlatformTransactionManager
doCommit
および doRollback
の実行後に、結果について呼び出されます。デフォルトの実装は何もしません。
例外をスローするべきではなく、エラーに対して警告を発行するだけです。
AbstractPlatformTransactionManager
の doCleanupAfterCompletion
transaction
- doGetTransaction
によって返されたトランザクションオブジェクト protected void prepareTransactionalConnection(java.sql.Connection con, TransactionDefinition definition) throws java.sql.SQLException
Connection
を準備します。"enforceReadOnly"
フラグが true
に設定され、トランザクション定義が読み取り専用トランザクションを示している場合、デフォルトの実装は "SET TRANSACTION READ ONLY" ステートメントを実行します。
"SET TRANSACTION READ ONLY" は Oracle、MySQL、Postgres によって理解され、他のデータベースでも機能する場合があります。この処理を適用する場合は、それに応じてこのメソッドをオーバーライドします。
con
- トランザクション JDBC 接続 definition
- 現在のトランザクション定義 java.sql.SQLException
- JDBC API によってスローされた場合 setEnforceReadOnly(boolean)