トランザクション分割は、自動コミットが無効化されたトランザクション内で発行される読み取りリクエストを、アプリケーションのコード変更を伴わず、プライマリインスタンスから読み取り専用インスタンスへオフロードします。すべてのクエリが自動コミット無効状態でトランザクション内で実行される場合、読み取り操作には書き込みアクセスが不要であるにもかかわらず、プライマリインスタンスがすべてのリクエストを処理します。トランザクション分割では、最初の書き込み開始前にこれらの読み取りリクエストを読み取り専用インスタンスへルーティングするため、プライマリインスタンスの負荷を低減し、その安定性を向上させます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ApsaraDB RDS for PostgreSQL インスタンスでデータベースプロキシ機能が有効化されていること。詳細については、「データベースプロキシ機能の有効化」をご参照ください。
仕組み
デフォルトでは、データベースプロキシはトランザクション内のすべてのリクエストを、読み書き整合性を保つためにプライマリインスタンスへ送信します。これは書き込み操作に必要ですが、書き込みの前に発行される読み取りリクエストについても、読み取り専用インスタンスで安全に処理可能であるにもかかわらず、プライマリインスタンスへ送信されます。
トランザクション分割は、以下の 2 つの条件が同時に満たされた場合にこの動作を変更します。
トランザクション分離レベルが READ COMMITTED(PostgreSQL のデフォルト)であること。
オートコミットが無効化されていること(
autocommit = off)。
これらの条件のもとでは、プロキシは最初の書き込み操作が発生するまで、プライマリインスタンス上でトランザクションを開くのを遅延させます。この書き込み以前に発行されたすべての読み取りリクエストは、ロードバランサーを経由して読み取り専用インスタンスへルーティングされます。
トランザクション分割は、データベースプロキシを有効化すると自動的に有効になります。個別に無効化することはできません。
制限事項
すべてのトランザクションが分割対象となるわけではありません。データベースプロキシを有効化する前に、トランザクション分割がご利用のワークロードに適しているかどうかを確認してください。
| 制約事項 | 詳細 |
|---|---|
| 明示的なトランザクション | BEGIN または START TRANSACTION で開始されたトランザクションは、分割されません。明示的なトランザクション内のすべてのリクエストはプライマリインスタンスへ送信されます。 |
| グローバル整合性 | トランザクション分割は、複数のリクエスト間におけるグローバル整合性を保証できません。データベースプロキシを有効化する前に、このトレードオフを評価してください。 |
| 無効化不可 | データベースプロキシを有効化すると、トランザクション分割は常にアクティブになります。個別に無効化するオプションはありません。 |
トランザクション分割の利用シーン
トランザクション分割は、アプリケーションが明示的な BEGIN または START TRANSACTION 文を使用せずに、読み取り負荷の高いクエリを自動コミット無効状態のトランザクションでラップする場合に最も効果的です。
| シナリオ | 適用可否 |
|---|---|
| オートコミットが無効化されており、書き込みの前に読み取りが主体となるアプリケーション | はい |
BEGIN または START TRANSACTION | いいえ — 読み取りは引き続きプライマリインスタンスで処理されます |
| すべての読み取り操作において厳格なグローバル整合性を要求するワークロード | いいえ — グローバル整合性は保証されません |
API リファレンス
| 操作 | 説明 |
|---|---|
| DescribeDBProxy | データベースプロキシの詳細を照会します |
| DescribeDBProxyEndpoint | データベースプロキシエンドポイントの情報を照会します |