クラス DataSourceTransactionManager
- 実装されているすべてのインターフェース:
SerializableSE, InitializingBean, ConfigurableTransactionManager, PlatformTransactionManager, ResourceTransactionManager, TransactionManager
- 既知の直属サブクラス
JdbcTransactionManager
DataSourceSE の PlatformTransactionManager 実装。このクラスは、セットアップで javax.sql.DataSource を Connection ファクトリメカニズムとして使用する限り、任意の JDBC ドライバーを備えた任意の環境で動作できます。指定された DataSource から現在のスレッドに JDBC Connection をバインドします。これにより、DataSource ごとに 1 つのスレッドバインド Connection が可能になる可能性があります。 注: このトランザクションマネージャーが動作する DataSource は、独立した Connection を返す必要があります。Connection は通常、接続プールから取得されますが、DataSource は、特にスコープ指定された、または制約された Connection を返してはなりません。このトランザクションマネージャーは、指定された伝播動作に従って、Connection をスレッドバインドされたトランザクションに関連付けます。トランザクションの進行中であっても、個別の独立した Connection を取得できることを前提としています。
標準の EE スタイルの DataSource.getConnection() 呼び出しではなく、DataSourceUtils.getConnection(DataSource) 経由で JDBC Connection を取得するには、アプリケーションコードが必要です。JdbcTemplate などの Spring クラスは、この戦略を暗黙的に使用します。このトランザクションマネージャーと組み合わせて使用しない場合、DataSourceUtils ルックアップ戦略はネイティブ DataSource ルックアップとまったく同じように動作します。持ち運び可能な方法で使用できます。
あるいは、Spring をまったく認識しないレガシーコードなど、アプリケーションコードが標準 EE スタイルの検索パターン DataSource.getConnection() で動作するようにすることもできます。その場合、ターゲット DataSource の TransactionAwareDataSourceProxy を定義し、そのプロキシ DataSource を DAO に渡します。これにより、アクセス時に Spring が管理するトランザクションに自動的に参加します。
カスタム分離レベルと、適切な JDBC ステートメントのタイムアウトとして適用されるタイムアウトをサポートします。後者をサポートするには、アプリケーションコードで JdbcTemplate を使用するか、作成された JDBC Statement ごとに DataSourceUtils.applyTransactionTimeout(Statement, DataSource) を呼び出すか、タイムアウトを認識する JDBC Connection および Statement を自動的に作成する TransactionAwareDataSourceProxy を経由する必要があります。
ターゲット DataSource の LazyConnectionDataSourceProxy を定義し、このトランザクションマネージャーと DAO の両方を指すようにすることを検討してください。これにより、「空の」トランザクション、つまり JDBC ステートメントが実行されないトランザクションの処理が最適化されます。LazyConnectionDataSourceProxy は、Statement が実行されるまで、ターゲット DataSource から実際の JDBC Connection をフェッチせず、指定されたトランザクション設定をターゲット Connection に遅延適用します。
このトランザクションマネージャーは、JDBC SavepointSE メカニズムを介してネストされたトランザクションをサポートします。ネストされたトランザクションはセーブポイントをサポートする 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 に合わせて、コミット / ロールバック例外変換を含む拡張サブクラスとして使用できます。
- 導入:
- 02.05.2003
- 作成者:
- Juergen Hoeller
- 関連事項:
ネストされたクラスの要約
クラス AbstractPlatformTransactionManager から継承されたネストクラス / インターフェース
AbstractPlatformTransactionManager.SuspendedResourcesHolderフィールドのサマリー
コンストラクターの概要
コンストラクターコンストラクター説明新しいDataSourceTransactionManagerインスタンスを作成します。DataSourceTransactionManager(DataSourceSE dataSource) 新しいDataSourceTransactionManagerインスタンスを作成します。メソッドのサマリー
修飾子と型メソッド説明voidprotected voiddoBegin(ObjectSE transaction, TransactionDefinition definition) 指定されたトランザクション定義に従って、セマンティクスで新しいトランザクションを開始します。protected voiddoCleanupAfterCompletion(ObjectSE transaction) トランザクション完了後にリソースをクリーンアップします。protected voiddoCommit(DefaultTransactionStatus status) 指定されたトランザクションの実際のコミットを実行します。protected ObjectSE現在のトランザクション状態のトランザクションオブジェクトを返します。protected void現在のトランザクションのリソースを再開します。protected voiddoRollback(DefaultTransactionStatus status) 指定されたトランザクションの実際のロールバックを実行します。protected void指定されたトランザクションをロールバックのみに設定します。protected ObjectSE現在のトランザクションのリソースを一時停止します。このインスタンスがトランザクションを管理する JDBCDataSourceを返します。このトランザクションマネージャーが操作するリソースファクトリ (JDBC DataSource や JMS ConnectionFactory など) を返します。booleanトランザクション接続で明示的なステートメントを使用して、トランザクションの読み取り専用の性質を強制するかどうかを返します。protected booleanisExistingTransaction(ObjectSE transaction) 指定されたトランザクションオブジェクトが既存のトランザクション(つまり、すでに開始されているトランザクション)を示しているかどうかを確認します。protected DataSourceSEDataSourceを入手して実際に使用してください。protected voidprepareTransactionalConnection(ConnectionSE con, TransactionDefinition definition) トランザクション開始直後にトランザクションConnectionを準備します。voidsetDataSource(@Nullable DataSourceSE dataSource) このインスタンスがトランザクションを管理する必要がある JDBCDataSourceを設定します。voidsetEnforceReadOnly(boolean enforceReadOnly) トランザクション接続の明示的なステートメント(Oracle、MySQL、Postgres で理解される "SETTRANSACTION READ ONLY" )を使用して、トランザクションの読み取り専用の性質(TransactionDefinition.isReadOnly()で示される)を強制するかどうかを指定します。protected RuntimeExceptionSEtranslateException(StringSE task, SQLExceptionSE ex) 指定された JDBC コミット / ロールバック例外を一般的な Spring 例外に変換して、AbstractPlatformTransactionManager.commit(TransactionStatus)/AbstractPlatformTransactionManager.rollback(TransactionStatus)呼び出しから伝播します。クラス AbstractPlatformTransactionManager から継承されたメソッド
commit, determineTimeout, getDefaultTimeout, getTransaction, getTransactionExecutionListeners, getTransactionSynchronization, invokeAfterCompletion, isFailEarlyOnGlobalRollbackOnly, isGlobalRollbackOnParticipationFailure, isNestedTransactionAllowed, isRollbackOnCommitFailure, isValidateExistingTransaction, prepareForCommit, prepareSynchronization, registerAfterCompletionWithExistingTransaction, resume, rollback, setDefaultTimeout, setFailEarlyOnGlobalRollbackOnly, setGlobalRollbackOnParticipationFailure, setNestedTransactionAllowed, setRollbackOnCommitFailure, setTransactionExecutionListeners, setTransactionSynchronization, setTransactionSynchronizationName, setValidateExistingTransaction, shouldCommitOnGlobalRollbackOnly, suspend, triggerBeforeCommit, triggerBeforeCompletion, useSavepointForNestedTransactionクラス ObjectSE から継承されたメソッド
clone, equalsSE, finalize, getClass, hashCode, notify, notifyAll, toString, wait, waitSE, waitSEインターフェース ConfigurableTransactionManager から継承されたメソッド
addListenerインターフェース PlatformTransactionManager から継承されたメソッド
commit, getTransaction, rollback
コンストラクターの詳細
DataSourceTransactionManager
public DataSourceTransactionManager()新しいDataSourceTransactionManagerインスタンスを作成します。DataSourceを使用するには、DataSourceを設定する必要があります。- 関連事項:
DataSourceTransactionManager
新しいDataSourceTransactionManagerインスタンスを作成します。- パラメーター:
dataSource- トランザクションを管理する JDBC DataSource
メソッドの詳細
setDataSource
このインスタンスがトランザクションを管理する必要がある JDBCDataSourceを設定します。これは通常、ローカルに定義された
DataSource、たとえば Hikari 接続プールになります。あるいは、JNDI からフェッチされた非 XADataSourceのトランザクションを管理することもできます。XADataSourceの場合は、代わりにJtaTransactionManagerを使用してください。ここで指定する
DataSourceは、TransactionAwareDataSourceProxyではなく、トランザクションを管理するターゲットDataSourceである必要があります。TransactionAwareDataSourceProxyではデータアクセスコードのみが動作しますが、トランザクションマネージャーは基礎となるターゲットDataSourceで動作する必要があります。それでもTransactionAwareDataSourceProxyが渡された場合は、そのターゲットDataSourceを抽出するためにラップが解除されます。ここで渡される
DataSourceは、独立したConnectionを返す必要があります。Connectionは通常、接続プールから取得されますが、DataSourceは、遅延フェッチされる可能性があるだけで、特にスコープ指定または制約されたConnectionを返すことはできません。- 関連事項:
getDataSource
このインスタンスがトランザクションを管理する JDBCDataSourceを返します。obtainDataSource
DataSourceを入手して実際に使用してください。- 戻り値:
- DataSource (非
null) - 例外:
IllegalStateExceptionSE- DataSource セットがない場合- 導入:
- 5.0
setEnforceReadOnly
public void setEnforceReadOnly(boolean enforceReadOnly) トランザクション接続の明示的なステートメント(Oracle、MySQL、Postgres で理解される "SETTRANSACTION READ ONLY" )を使用して、トランザクションの読み取り専用の性質(TransactionDefinition.isReadOnly()で示される)を強制するかどうかを指定します。接続で実行される SQL ステートメントを含む正確な処理は、
prepareTransactionalConnection(Connection, TransactionDefinition)を使用してカスタマイズできます。この読み取り専用処理モードは、Spring がデフォルトで適用する
Connection.setReadOnly(boolean)SE ヒントを超えています。その標準 JDBC ヒントとは対照的に、"SET TRANSACTION READ ONLY" は、データ操作ステートメントが厳密に許可されない分離レベルのような接続モードを強制します。また、Oracle では、この読み取り専用モードはトランザクション全体の読み取り一貫性を提供します。古い Oracle JDBC ドライバ (9i、10g) では、
Connection.setReadOnly(trueに対してもこの読み取り専用モードが強制されていました。ただし、最近のドライバでは、この強力な強制は、たとえばこのフラグを通じて明示的に適用する必要があります。- 導入:
- 4.3.7
- 関連事項:
isEnforceReadOnly
public boolean isEnforceReadOnly()トランザクション接続で明示的なステートメントを使用して、トランザクションの読み取り専用の性質を強制するかどうかを返します。- 導入:
- 4.3.7
- 関連事項:
afterPropertiesSet
public void afterPropertiesSet()インターフェースからコピーされた説明:InitializingBeanすべての Bean プロパティを設定し、BeanFactoryAware、ApplicationContextAwareなどを満たした後、包含BeanFactoryによって呼び出されます。このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されたときに、その全体的な構成の検証と最終的な初期化を実行できます。
- 次で指定:
- インターフェース
InitializingBeanのafterPropertiesSet
getResourceFactory
インターフェースからコピーされた説明:ResourceTransactionManagerこのトランザクションマネージャーが操作するリソースファクトリ (JDBC DataSource や JMS ConnectionFactory など) を返します。このターゲットリソースファクトリは、通常、スレッドごとの
TransactionSynchronizationManagerのリソースバインディングのリソースキーとして使用されます。- 次で指定:
- インターフェース
ResourceTransactionManagerのgetResourceFactory - 戻り値:
- ターゲットリソースファクトリ (非
null) - 関連事項:
doGetTransaction
クラスからコピーされた説明:AbstractPlatformTransactionManager現在のトランザクション状態のトランザクションオブジェクトを返します。返されるオブジェクトは通常、具体的なトランザクションマネージャーの実装に固有のものであり、対応するトランザクション状態を変更可能な形式で保持します。このオブジェクトは、他のテンプレートメソッド (doBegin や doCommit など) に直接、または DefaultTransactionStatus インスタンスの一部として渡されます。
返されるオブジェクトには、既存のトランザクション、つまり、トランザクションマネージャーでの現在の
getTransaction呼び出しの前にすでに開始されているトランザクションに関する情報が含まれている必要があります。その結果、doGetTransaction実装は通常、既存のトランザクションを探し、返されたトランザクションオブジェクトに対応する状態を格納します。- 次で指定:
- クラス
AbstractPlatformTransactionManagerのdoGetTransaction - 戻り値:
- 現在のトランザクションオブジェクト
- 関連事項:
isExistingTransaction
クラスからコピーされた説明:AbstractPlatformTransactionManager指定されたトランザクションオブジェクトが既存のトランザクション(つまり、すでに開始されているトランザクション)を示しているかどうかを確認します。結果は、新しいトランザクションに対して指定された伝播動作に従って評価されます。既存のトランザクションが中断される(PROPAGATION_REQUIRES_NEW の場合)か、新しいトランザクションが既存のトランザクションに参加する可能性があります(PROPAGATION_REQUIRED の場合)。
デフォルト実装は
falseを返しますが、既存のトランザクションへの参加は一般にサポートされていないと想定しています。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。- オーバーライド:
- クラス
AbstractPlatformTransactionManagerのisExistingTransaction - パラメーター:
transaction- doGetTransaction によって返されるトランザクションオブジェクト- 戻り値:
- 既存のトランザクションがある場合
- 関連事項:
doBegin
クラスからコピーされた説明:AbstractPlatformTransactionManager指定されたトランザクション定義に従って、セマンティクスで新しいトランザクションを開始します。伝播動作の適用を気にする必要はありません。これは、この抽象マネージャーによってすでに処理されているためです。このメソッドは、トランザクションマネージャーが実際に新しいトランザクションを開始することを決定したときに呼び出されます。以前にトランザクションがなかったか、前のトランザクションが中断されています。
特別なシナリオは、セーブポイントのないネストされたトランザクションです:
useSavepointForNestedTransaction()が "false" を返す場合、このメソッドは、必要に応じてネストされたトランザクションを開始するために呼び出されます。このようなコンテキストでは、アクティブなトランザクションがあります。このメソッドの実装はこれを検出し、適切なネストされたトランザクションを開始する必要があります。- 次で指定:
- クラス
AbstractPlatformTransactionManagerのdoBegin - パラメーター:
transaction-doGetTransactionによって返されるトランザクションオブジェクトdefinition- 伝播動作、分離レベル、読み取り専用フラグ、タイムアウト、トランザクション名を記述する TransactionDefinition インスタンス
doSuspend
クラスからコピーされた説明:AbstractPlatformTransactionManager現在のトランザクションのリソースを一時停止します。トランザクションの同期はすでに中断されています。トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
- オーバーライド:
- クラス
AbstractPlatformTransactionManagerのdoSuspend - パラメーター:
transaction-doGetTransactionによって返されるトランザクションオブジェクト- 戻り値:
- 中断されたリソースを保持するオブジェクト (doResume に渡すために検査されないままになります)
- 関連事項:
doResume
クラスからコピーされた説明:AbstractPlatformTransactionManager現在のトランザクションのリソースを再開します。トランザクションの同期はその後再開されます。トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
- オーバーライド:
- クラス
AbstractPlatformTransactionManagerのdoResume - パラメーター:
transaction-doGetTransactionによって返されるトランザクションオブジェクトsuspendedResources- doSuspend によって返される、中断されたリソースを保持するオブジェクト- 関連事項:
doCommit
クラスからコピーされた説明:AbstractPlatformTransactionManager指定されたトランザクションの実際のコミットを実行します。実装では、「新規トランザクション」フラグまたはロールバック専用フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートコミットが実行されます。
- 次で指定:
- クラス
AbstractPlatformTransactionManagerのdoCommit - パラメーター:
status- トランザクションのステータス表現- 関連事項:
doRollback
クラスからコピーされた説明:AbstractPlatformTransactionManager指定されたトランザクションの実際のロールバックを実行します。実装では、「新しいトランザクション」フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートロールバックが実行されます。
- 次で指定:
- クラス
AbstractPlatformTransactionManagerのdoRollback - パラメーター:
status- トランザクションのステータス表現- 関連事項:
doSetRollbackOnly
クラスからコピーされた説明:AbstractPlatformTransactionManager指定されたトランザクションをロールバックのみに設定します。現在のトランザクションが既存のトランザクションに参加している場合にのみ、ロールバック時に呼び出されます。既存のトランザクションへの参加は一般にサポートされていないと想定して、デフォルトの実装は IllegalTransactionStateException をスローします。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
- オーバーライド:
- クラス
AbstractPlatformTransactionManagerのdoSetRollbackOnly - パラメーター:
status- トランザクションのステータス表現
doCleanupAfterCompletion
クラスからコピーされた説明:AbstractPlatformTransactionManagerトランザクション完了後にリソースをクリーンアップします。doCommitおよびdoRollbackの実行後に、結果について呼び出されます。デフォルトの実装は何もしません。例外をスローするべきではなく、エラーに対して警告を発行するだけです。
- オーバーライド:
- クラス
AbstractPlatformTransactionManagerのdoCleanupAfterCompletion - パラメーター:
transaction-doGetTransactionによって返されるトランザクションオブジェクト
prepareTransactionalConnection
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 によってスローされた場合- 導入:
- 4.3.7
- 関連事項:
translateException
指定された JDBC コミット / ロールバック例外を一般的な Spring 例外に変換して、AbstractPlatformTransactionManager.commit(TransactionStatus)/AbstractPlatformTransactionManager.rollback(TransactionStatus)呼び出しから伝播します。デフォルトの実装は
TransactionSystemExceptionをスローします。サブクラスは、並行性の失敗などを明確に識別する場合があります。- パラメーター:
task- タスクの説明 (コミットまたはロールバック)ex- コミット / ロールバックからスローされる SQLException- 戻り値:
- スローする変換された例外、
DataAccessExceptionまたはTransactionException - 導入:
- 5.3