春-トランザクション管理
データベーストランザクションは、単一の作業単位として扱われる一連のアクションです。これらのアクションは、完全に完了するか、まったく効果がないかのいずれかです。トランザクション管理は、データの整合性と一貫性を確保するためのRDBMS指向のエンタープライズアプリケーションの重要な部分です。トランザクションの概念は、次の4つの主要なプロパティで説明できます。ACID −
Atomicity −トランザクションは、単一の操作単位として扱う必要があります。これは、一連の操作全体が成功または失敗することを意味します。
Consistency −これは、データベースの参照整合性、テーブル内の一意の主キーなどの一貫性を表します。
Isolation−同じデータセットで同時に多くのトランザクション処理が行われる可能性があります。データの破損を防ぐために、各トランザクションは他のトランザクションから分離する必要があります。
Durability −トランザクションが完了すると、このトランザクションの結果を永続的にする必要があり、システム障害のためにデータベースから消去することはできません。
実際のRDBMSデータベースシステムは、各トランザクションの4つのプロパティすべてを保証します。SQLを使用してデータベースに発行されたトランザクションの単純なビューは次のとおりです。
begintransactionコマンドを使用してトランザクションを開始します。
SQLクエリを使用して、さまざまな削除、更新、または挿入操作を実行します。
すべての操作が成功した場合は、コミットを実行します。それ以外の場合は、すべての操作をロールバックします。
Spring Frameworkは、基盤となるさまざまなトランザクション管理APIの上に抽象レイヤーを提供します。Springのトランザクションサポートは、POJOにトランザクション機能を追加することにより、EJBトランザクションの代替手段を提供することを目的としています。Springは、プログラムによるトランザクション管理と宣言型のトランザクション管理の両方をサポートしています。EJBにはアプリケーションサーバーが必要ですが、Springトランザクション管理はアプリケーションサーバーを必要とせずに実装できます。
ローカルトランザクションとグローバルトランザクション
ローカルトランザクションはJDBC接続のような単一のトランザクションリソースに固有ですが、グローバルトランザクションは分散システムのトランザクションのように複数のトランザクションリソースにまたがることができます。
ローカルトランザクション管理は、アプリケーションコンポーネントとリソースが単一のサイトに配置され、トランザクション管理に単一のマシンで実行されているローカルデータマネージャーのみが関与する集中型コンピューティング環境で役立ちます。ローカルトランザクションは実装が簡単です。
グローバルトランザクション管理は、すべてのリソースが複数のシステムに分散されている分散コンピューティング環境で必要です。このような場合、トランザクション管理はローカルレベルとグローバルレベルの両方で実行する必要があります。分散トランザクションまたはグローバルトランザクションは複数のシステム間で実行され、その実行には、グローバルトランザクション管理システムと関連するすべてのシステムのすべてのローカルデータマネージャー間の調整が必要です。
プログラマティックvs.宣言型
Springは2種類のトランザクション管理をサポートしています-
プログラムによるトランザクション管理-これは、プログラミングの助けを借りてトランザクションを管理する必要があることを意味します。それはあなたに極端な柔軟性を与えますが、維持するのは難しいです。
宣言型トランザクション管理-これは、トランザクション管理をビジネスコードから分離することを意味します。トランザクションの管理には、注釈またはXMLベースの構成のみを使用します。
宣言型トランザクション管理は、コードを介してトランザクションを制御できるプログラマティックトランザクション管理よりも柔軟性が劣りますが、プログラマティックトランザクション管理よりも適しています。しかし、一種の横断的関心事として、宣言型トランザクション管理はAOPアプローチでモジュール化できます。Springは、SpringAOPフレームワークを通じて宣言型トランザクション管理をサポートします。
Springトランザクションの抽象化
Springトランザクションの抽象化の鍵は、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;
}
シニア番号 | 方法と説明 |
---|---|
1 | TransactionStatus getTransaction(TransactionDefinition definition) このメソッドは、指定された伝播動作に従って、現在アクティブなトランザクションを返すか、新しいトランザクションを作成します。 |
2 | void commit(TransactionStatus status) このメソッドは、ステータスに関して、指定されたトランザクションをコミットします。 |
3 | void rollback(TransactionStatus status) このメソッドは、指定されたトランザクションのロールバックを実行します。 |
TransactionDefinitionはスプリングでトランザクション・サポートのコアインタフェースであり、以下のように定義されます-
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
シニア番号 | 方法と説明 |
---|---|
1 | int getPropagationBehavior() このメソッドは、伝播動作を返します。Springは、EJBCMTでおなじみのすべてのトランザクション伝播オプションを提供します。 |
2 | int getIsolationLevel() このメソッドは、このトランザクションが他のトランザクションの作業から分離されている度合いを返します。 |
3 | String getName() このメソッドは、このトランザクションの名前を返します。 |
4 | int getTimeout() このメソッドは、トランザクションが完了する必要がある時間を秒単位で返します。 |
5 | boolean isReadOnly() このメソッドは、トランザクションが読み取り専用かどうかを返します。 |
分離レベルの可能な値は次のとおりです-
シニア番号 | 分離と説明 |
---|---|
1 | TransactionDefinition.ISOLATION_DEFAULT これはデフォルトの分離レベルです。 |
2 | TransactionDefinition.ISOLATION_READ_COMMITTED ダーティリードが防止されていることを示します。繰り返し不可能な読み取りとファントム読み取りが発生する可能性があります。 |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED ダーティ読み取り、繰り返し不可能な読み取り、およびファントム読み取りが発生する可能性があることを示します。 |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ ダーティ読み取りと繰り返し不可能な読み取りが防止されていることを示します。ファントム読み取りが発生する可能性があります。 |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE ダーティ読み取り、繰り返し不可能な読み取り、およびファントム読み取りが防止されていることを示します。 |
伝播タイプの可能な値は次のとおりです-
シニア番号 | 伝播と説明 |
---|---|
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 基礎となるトランザクションシステムのデフォルトのタイムアウトを使用します。タイムアウトがサポートされていない場合はnoneを使用します。 |
TransactionStatusのインタフェースは、トランザクションの実行とクエリのトランザクションの状態を制御するために、トランザクションコードのための簡単な方法を提供します。
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
シニア番号 | 方法と説明 |
---|---|
1 | boolean hasSavepoint() このメソッドは、このトランザクションが内部でセーブポイントを保持しているかどうか、つまり、セーブポイントに基づいてネストされたトランザクションとして作成されているかどうかを返します。 |
2 | boolean isCompleted() このメソッドは、このトランザクションが完了したかどうか、つまり、すでにコミットされているかロールバックされているかを返します。 |
3 | boolean isNewTransaction() 現在のトランザクションが新しい場合、このメソッドはtrueを返します。 |
4 | boolean isRollbackOnly() このメソッドは、トランザクションがロールバックのみとしてマークされているかどうかを返します。 |
5 | void setRollbackOnly() このメソッドは、トランザクションをロールバックのみとして設定します。 |