トランザクション

トランザクションには、データ保管および操作に関して 多くの利点があります。トランザクションを使用すれば、同時変更からデータ・グリッドを保護したり、複数の変更を 1 つの並行ユニットとして適用したり、データを複製したり、変更に対するロックのライフサイクルを実装したりすることができます。

トランザクションが開始すると、WebSphere® eXtreme Scale は別の特別なマップを割り振って、そのトランザクションが使用するキーと値のペアの現在の変更またはコピーを保持します。通常、キーと値のペアにアクセスすると、アプリケーションがその値を受け取る前に、値のコピーが作成されます。 その別のマップは、挿入、更新、取得、除去などの操作についてすべての変更を追跡します。 キーは不変のものと見なされているため、コピーされません。ObjectTransformer オブジェクトを指定すると、このオブジェクトが値をコピーするために使用されます。 トランザクションがオプティミスティック・ロックを使用している場合は、トランザクションのコミット時に、以前の値のイメージも比較のために追跡されます。

トランザクションがロールバックされる場合、その別のマップの情報は破棄され、エントリーに対するロックは解除されます。トランザクションをコミットすると、変更がマップに適用され、ロックが解除されます。 オプティミスティック・ロックが使用されている場合、eXtreme Scale は、以前のイメージ・バージョンの値とマップ内の値を比較します。 トランザクションをコミットするには、これらの値が一致している必要があります。こうした比較によって複数バージョンのロック体系が可能になりますが、トランザクションがそのエントリーにアクセスすると、代わりに 2 つのコピーが作成されます。 すべての値が再度コピーされ、新しいコピーがマップに保管されます。 WebSphere eXtreme Scale は、コミット後に値へのアプリケーション参照を変更するアプリケーションから自身を保護するために、このコピーを実行します。

情報の複数のコピーを使用しないようにできます。 アプリケーションは、並行性を制限する代償としてオプティミスティック・ロックの代わりにペシミスティック・ロックを使用することで、コピーを節約できます。 コミット後に値を変更しないことにアプリケーションが同意すれば、 コミット時の値のコピーも回避することができます。

トランザクションの利点

トランザクションを使用するのは、以下の理由からです。
トランザクションを使用して、以下の操作を行うことができます。
  • 例外が発生した場合や、ビジネス・ロジックにより状態変更を元に戻す必要がある場合に、変更をロールバックします。
  • コミット時に複数の変更をアトミック単位で適用する
  • データに対するロックの保持および解除を行い、コミット時に複数の変更をアトミック単位で適用します。
  • 同時変更からスレッドを保護します。
  • 変更に対するロックのライフサイクルを実装します。
  • アトミック単位のレプリカ生成をします。

トランザクション・サイズ

トランザクションは、特にレプリカ生成の場合には、大きいほど効果的です。 ただし、大きなトランザクションの場合はエントリーのロックの保持時間が長くなるため、並行性に悪影響を及ぼします。大きなトランザクションを使用すると、レプリカ生成のパフォーマンスが向上する場合があります。 このパフォーマンスの向上は、マップを事前にロードする場合には重要です。さまざまなバッチ・サイズで実験を行い、使用するシナリオに最適なサイズを判別してください。

大きなトランザクションはローダーにとっても好都合です。 SQL バッチを実行できるローダーを使用している場合は、トランザクションによっては著しくパフォーマンスが向上する可能性があり、データベース側ではロードを著しく削減することができます。 このパフォーマンス向上は、ローダーの実装方法によって異なります。

自動コミット・モード

アクティブに始動されたトランザクションがない場合は、アプリケーションが ObjectMap オブジェクトとの対話を行うと、アプリケーションの代わりに自動的に開始およびコミット操作が行われます。この自動的な開始およびコミット操作は役に立ちますが、ロールバックおよびロックが有効に機能する妨げとなります。 トランザクションのサイズが小さすぎると、同期レプリカ生成スピードに影響します。 エンティティー・マネージャー・アプリケーションを使用している場合は、自動コミット・モードは使用しないでください。その理由は、EntityManager.find メソッドで検索されたオブジェクトが、そのメソッドが戻されると同時に管理不能となり、使用不可となるためです。

外部トランザクション・コーディネーター

通常、トランザクションは、session.begin メソッドで開始し、session.commit メソッドで終了します。 ただし、eXtreme Scale が組み込まれていると、トランザクションは、外部トランザクション・コーディネーターによって開始および終了する場合があります。外部トランザクション・コーディネーターを使用している場合は、session.begin メソッドを呼び出す必要も、session.commit メソッドで終了する必要もありません。

Java EE トランザクション統合

eXtreme Scale は、リモート・データ・グリッドへのクライアント接続とローカル・トランザクション管理の両方をサポートする Java Connector Architecture (JCA) 1.5 準拠リソース・アダプターを含みます。 サーブレットなどの Java Platform, Enterprise Edition (Java EE) アプリケーション、 JavaServer Pages (JSP) ファイル、および Enterprise JavaBeans (EJB) コンポーネントは、標準 javax.resource.cci.LocalTransaction インターフェースまたは eXtreme Scale セッション・インターフェースを使用して、eXtreme Scale トランザクションを区分することができます。

WebSphere Application Server で最終参加者サポートが有効になっている状態でアプリケーションを実行しているときには、eXtreme Scale トランザクションを、他の 2 フェーズ・コミット・トランザクション・リソースと共にグローバル・トランザクションに登録することができます。