Spring-transaction-management
Spring-トランザクション管理
データベーストランザクションは、単一の作業単位として扱われる一連のアクションです。 これらのアクションは、完全に完了するか、まったく効果がありません。 トランザクション管理は、データの整合性と一貫性を確保するためのRDBMS指向のエンタープライズアプリケーションの重要な部分です。 トランザクションの概念は、 ACID として説明される次の4つの主要なプロパティで説明できます-
- *アトミック性-トランザクションは単一の操作単位として扱われる必要があります。つまり、操作のシーケンス全体が成功するか失敗するかのいずれかです。
- 一貫性-これは、データベースの参照整合性、テーブル内の一意の主キーなどの一貫性を表します。
- 分離-同時に同じデータセットで多くのトランザクション処理が行われる場合があります。 データの破損を防ぐために、各トランザクションを他のトランザクションから分離する必要があります。
- 耐久性-トランザクションが完了したら、このトランザクションの結果を永続的にする必要があり、システム障害のためにデータベースから消去することはできません。
実際のRDBMSデータベースシステムは、各トランザクションの4つのプロパティすべてを保証します。 SQLを使用してデータベースに発行されたトランザクションの単純化されたビューは次のとおりです-
- _begin transaction_コマンドを使用してトランザクションを開始します。
- SQLクエリを使用して、さまざまな削除、更新、または挿入操作を実行します。
- すべての操作が成功した場合は、_commit_を実行します。それ以外の場合は、_rollback_すべての操作を実行します。
Springフレームワークは、さまざまな基盤となるトランザクション管理APIの上に抽象レイヤーを提供します。 Springのトランザクションサポートは、トランザクション機能をPOJOに追加することにより、EJBトランザクションの代替を提供することを目的としています。 Springは、プログラムによるトランザクション管理と宣言的なトランザクション管理の両方をサポートしています。 EJBにはアプリケーションサーバーが必要ですが、アプリケーションサーバーを必要とせずにSpringトランザクション管理を実装できます。
ローカルvs. グローバルトランザクション
ローカルトランザクションはJDBC接続のような単一のトランザクションリソースに固有ですが、グローバルトランザクションは分散システムのトランザクションのような複数のトランザクションリソースにまたがることができます。
ローカルトランザクション管理は、アプリケーションコンポーネントとリソースが単一のサイトに配置され、トランザクション管理が単一のマシン上で実行されるローカルデータマネージャのみを含む集中コンピューティング環境で役立ちます。 ローカルトランザクションの実装は簡単です。
すべてのリソースが複数のシステムに分散されている分散コンピューティング環境では、グローバルトランザクション管理が必要です。 このような場合、トランザクション管理はローカルレベルとグローバルレベルの両方で行う必要があります。 分散トランザクションまたはグローバルトランザクションは複数のシステムにわたって実行され、その実行には、グローバルトランザクション管理システムと、関連するすべてのシステムのすべてのローカルデータマネージャーとの間の調整が必要です。
プログラマティックと 宣言的
Springは2種類のトランザクション管理をサポートしています-
- link:/spring/programmatic_management [プログラムによるトランザクション管理]-これは、プログラミングを使用してトランザクションを管理する必要があることを意味します。 これにより柔軟性が非常に高くなりますが、維持するのは困難です。 *link:/spring/declarative_management [宣言型トランザクション管理]-これは、トランザクション管理をビジネスコードから分離することを意味します。 トランザクションを管理するには、注釈またはXMLベースの構成のみを使用します。
宣言的なトランザクション管理は、プログラムによるトランザクション管理よりも望ましいですが、プログラムによるトランザクション管理よりも柔軟性が低いため、コードを使用してトランザクションを制御できます。 しかし、横断的な関心事の一種として、宣言的なトランザクション管理をAOPアプローチでモジュール化できます。 Springは、Spring AOPフレームワークによる宣言的なトランザクション管理をサポートしています。
Spring Transaction Abstractions
春のトランザクションの抽象化への鍵は、次のような_org.springframework.transaction.PlatformTransactionManager_インターフェイスによって定義されています-
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
Sr.No | Method & Description |
---|---|
1 |
このメソッドは、指定された伝播動作に従って、現在アクティブなトランザクションを返すか、新しいトランザクションを作成します。 |
2 |
void commit(TransactionStatus status) このメソッドは、ステータスに関して、指定されたトランザクションをコミットします。 |
3 |
void rollback(TransactionStatus status) このメソッドは、指定されたトランザクションのロールバックを実行します。 |
_TransactionDefinition_は、Springのトランザクションサポートのコアインターフェースであり、次のように定義されています-
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
Sr.No | Method & Description |
---|---|
1 |
int getPropagationBehavior() このメソッドは、伝播動作を返します。 Springは、EJB CMTでよく知られているすべてのトランザクション伝播オプションを提供します。 |
2 |
int getIsolationLevel() このメソッドは、このトランザクションが他のトランザクションの作業から分離されている度合いを返します。 |
3 |
String getName() このメソッドは、このトランザクションの名前を返します。 |
4 |
int getTimeout() このメソッドは、トランザクションを完了する必要がある時間を秒単位で返します。 |
5 |
boolean isReadOnly() このメソッドは、トランザクションが読み取り専用かどうかを返します。 |
分離レベルの可能な値は次のとおりです-
Sr.No | Isolation & Description |
---|---|
1 |
TransactionDefinition.ISOLATION_DEFAULT これはデフォルトの分離レベルです。 |
2 |
TransactionDefinition.ISOLATION_READ_COMMITTED ダーティリードが防止されることを示します。繰り返し不可の読み取りとファントム読み取りが発生する可能性があります。 |
3 |
TransactionDefinition.ISOLATION_READ_UNCOMMITTED ダーティー読み取り、反復不能読み取り、および幻像読み取りが発生する可能性があることを示します。 |
4 |
TransactionDefinition.ISOLATION_REPEATABLE_READ ダーティリードおよび繰り返し不可のリードが防止されることを示します。ファントムリードが発生する可能性があります。 |
5 |
TransactionDefinition.ISOLATION_SERIALIZABLE ダーティー読み取り、反復不能読み取り、およびファントム読み取りが防止されることを示します。 |
以下は、伝播タイプの可能な値です-
Sr.No. | Propagation & Description |
---|---|
1 |
TransactionDefinition.PROPAGATION_MANDATORY 現在のトランザクションをサポートします。現在のトランザクションが存在しない場合、例外をスローします。 |
2 |
TransactionDefinition.PROPAGATION_NESTED 現在のトランザクションが存在する場合、ネストされたトランザクション内で実行されます。 |
3 |
TransactionDefinition.PROPAGATION_NEVER 現在のトランザクションをサポートしていません。現在のトランザクションが存在する場合、例外をスローします。 |
4 |
TransactionDefinition.PROPAGATION_NOT_SUPPORTED 現在のトランザクションをサポートしていません。むしろ、常に非トランザクションで実行します。 |
5 |
TransactionDefinition.PROPAGATION_REQUIRED 現在のトランザクションをサポートします。存在しない場合は新しいものを作成します。 |
6 |
TransactionDefinition.PROPAGATION_REQUIRES_NEW 新しいトランザクションを作成し、現在のトランザクションが存在する場合は中断します。 |
7 |
TransactionDefinition.PROPAGATION_SUPPORTS 現在のトランザクションをサポートします。存在しない場合、非トランザクションで実行されます。 |
8 |
TransactionDefinition.TIMEOUT_DEFAULT 基になるトランザクションシステムの既定のタイムアウトを使用します。タイムアウトがサポートされていない場合は、なしを使用します。 |
_TransactionStatus_インターフェイスは、トランザクションコードがトランザクションの実行を制御し、トランザクションステータスを照会する簡単な方法を提供します。
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
Sr.No. | Method & Description |
---|---|
1 |
boolean hasSavepoint() このメソッドは、このトランザクションが内部的にセーブポイントを保持しているかどうか、つまり、セーブポイントに基づいてネストされたトランザクションとして作成されたかどうかを返します。 |
2 |
boolean isCompleted() このメソッドは、このトランザクションが完了したかどうか、つまり、すでにコミットまたはロールバックされているかどうかを返します。 |
3 |
boolean isNewTransaction() このメソッドは、現在のトランザクションが新しい場合にtrueを返します。 |
4 |
boolean isRollbackOnly() このメソッドは、トランザクションがロールバック専用としてマークされているかどうかを返します。 |
5 |
void setRollbackOnly() このメソッドは、トランザクションをロールバック専用として設定します。 |