読み書きモードでクラスターエンドポイントを使用すると、Java Database Connectivity (JDBC) ドライバーなどの一部のデータベースクライアントドライバーは、すべてのリクエストを自動的にトランザクションでラップします。これにより、読み取り専用クエリを含むすべてのトラフィックがプライマリノードに送信されます。その結果、読み取り専用ノードはアイドル状態のままとなり、プライマリノードが不要な負荷を処理することになります。これを修正するために追加のコード変更は必要ありません。
トランザクション分割機能を使用すると、PolarProxy はトランザクション内の読み取りリクエストを読み取り専用ノードにルーティングし、アプリケーションコードを変更することなく負荷を再分散できます。この機能は、読み書き整合性を確保するためにも使用できます。
仕組み
デフォルトでは、読み書きモードでクラスターエンドポイントを使用する場合、PolarProxy はセッション内のすべてのリクエストをプライマリノードに送信します。JDBC のようなドライバーはすべてのリクエストをトランザクションでラップするため、書き込みを伴うかどうかにかかわらず、読み取り専用クエリでさえプライマリノードにヒットします。

基本的なトランザクション分割を有効にすると、PolarProxy は各トランザクション内で読み取りと書き込みを分割します:
トランザクション内で最初の書き込みリクエストより前に受信した読み取りリクエストは、読み取り専用ノードに転送されます。
最初の書き込みリクエストが到着すると、データ整合性を維持するために、後続のすべてのリクエスト (読み取りと書き込みの両方) がプライマリノードに転送されます。
未コミットのデータは、読み取り専用ノードからは表示されません。

トランザクション分割の利用シーン
トランザクション分割は、次のような場合に最も効果的です:
アプリケーションが読み書きモードでクラスターエンドポイントを使用している。
ワークロードが主に読み取り負荷が高い。
読み取りがドライバーによって自動的にトランザクションでラップされている (例:
autoCommit=falseを設定した JDBC アプリケーション)。
アプリケーションがすでに読み取りを読み取り専用エンドポイントに直接ルーティングしている場合や、ワークロードが主に書き込み負荷が高い場合は、トランザクション分割のメリットはありません。
制限事項
分離レベル:リードコミッティド分離レベルを使用するトランザクションのみ分割できます。他の分離レベル (リピータブルリードやシリアライザブルなど) は、安定したスナップショットに依存する整合性を保証するためにセッションを単一ノードに固定する必要があるため、分割はできません。
整合性レベルとの相互作用:整合性レベルが結果整合性に設定されていない場合、PolarProxy は、読み取り専用ノードがプライマリノードからのデータを完全に同期した後にのみ、書き込み前の読み取りリクエストを読み取り専用ノードに送信します。ノードの同期が遅れている場合、PolarProxy は読み取りリクエストをプライマリノードに送信するフォールバック処理を行います。詳細については、「」をご参照ください。
トランザクション分割の有効化
前提条件
開始する前に、以下のものがあることを確認してください:
少なくとも 1 つの読み取り専用ノードを持つ PolarDB for PostgreSQL (Compatible with Oracle) クラスター
読み書きモードで設定されたクラスターエンドポイント
操作手順
PolarDB コンソールにログインします。
左上のコーナーで、クラスターがデプロイされているリージョンを選択します。
対象のクラスターを見つけ、その ID をクリックします。
[クラスターエンドポイント] セクションで、[変更] をクリックします。
[トランザクション分割] の横にある [オン] をクリックします。
トランザクション分割は、新しい接続に対してのみ有効になります。既存の接続に変更を適用するには、それらを閉じて再接続してください。

[OK] をクリックします。
API リファレンス
| 操作 | 説明 |
|---|---|
| ModifyDBClusterEndpoint | クラスターエンドポイントの属性 (読み書きモード、整合性レベル、トランザクション分割、プライマリノードからの読み取りリクエストのオフロードの有無など) を変更します。指定したクラスターエンドポイントを新しく追加されたノードに関連付けるかどうかも指定できます。 |