Amazon QLDB 同時実行モデル - Amazon Quantum Ledger Database (Amazon QLDB)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon QLDB 同時実行モデル

Amazon QLDB は、高性能なオンライントランザクション処理 (OLTP) ワークロードのニーズに対処することを目的としています。QLDB は、SQL に似たクエリ機能をサポートしており、完全に ACID なトランザクションを提供します。さらに、QLDB のデータ項目は、柔軟なスキーマや直感的なデータモデリングを提供するドキュメントでもあります。ジャーナルを中核とするQLDB では、データへのあらゆる変更の完全かつ検証可能な履歴にアクセスしたり、必要に応じて一貫したトランザクションを他のデータサービスに流したりすることが容易になります。

オプティミスティック同時実行制御

QLDB では、同時実行制御は、オプティミスティック同時実行制御(OCC)。OCC は、複数のトランザクションが干渉し合うことなく頻繁に完了できるという原則に基づいています。

OCC を使用すると、QLDB のトランザクションはデータベースリソースのロックを取得せず、完全な直列化可能な分離で動作します。QLDB では、同時トランザクションをシリアル方法で実行し、それらのトランザクションが連続して開始された場合と同じ効果を発揮します。

コミットする前に、各トランザクションは検証チェックを実行し、アクセスしているデータが他のコミットされたトランザクションによって変更されていないことを確認します。このチェックによって競合する変更、またはデータの変更の状態が明らかになった場合、コミットトランザクションは拒否されます。ただし、トランザクションは再開できます。

トランザクションが QLDB に書き込む場合、OCC モデルの検証チェックが QLDB 自体によって実装されます。OCC の検証段階で明らかとなった問題によりトランザクションがジャーナルに書き込まれない場合、QLDB はOccConflictExceptionアプリケーション層に移動します。トランザクションの再責任はアプリケーションソフトウェアが負います。アプリケーションは、拒否されたトランザクションを中止し、最初からトランザクション全体を再試行する必要があります。

QLDB ドライバが OCC 競合およびその他の一時的な例外を処理して再試行する方法については、を参照してください。Amazon QLDB でのドライバでの再試行ポリシーについて

インデックスを使用してテーブル全体のスキャンを回避する

QLDBでは、すべてのSELECTクエリはトランザクションで処理され、トランザクションタイムアウト制限

ベストプラクティスとしては、ステートメントをWHEREインデックス付きフィールドまたはドキュメント ID をフィルタリングする述語句。QLDB には等号ドキュメントを効率的に検索するためのインデックス付きフィールドの演算子。たとえば、WHERE indexedField = 123またはWHERE indexedField IN (456, 789)

このインデックス付きルックアップがなければ、QLDB はテーブル全体のスキャン文書を読むとき。これにより、クエリのレイテンシーやトランザクションタイムアウトが発生し、競合するトランザクションと OCC が競合する可能性が高くなります。

たとえば、VIN フィールドにのみインデックスがある Vehicle という名前のテーブルについて考えます。これには以下のデータが含まれています。

VIN Make モデル カラー
"1N4AL11D75C109151" "Audi" "A5" "Silver"
"KM8SRDHF6EU074761" "Tesla" "Model S" "Blue"
"3HGGK5G53FM761765" "Ducati" "Monster 1200" "Yellow"
"1HVBBAANXWH544237" "Ford" "F 150" "Black"
"1C4RJFAG0FC625797" "Mercedes" "CLK 350" "White"

2 人の同時ユーザー (Alice と Bob) が、台帳内の同じテーブルを使用しています。彼らは、次のように 2 つの異なるドキュメントを更新します。

Alice:

UPDATE Vehicle AS v SET v.Color = 'Blue' WHERE v.VIN = '1N4AL11D75C109151'

Bob:

UPDATE Vehicle AS v SET v.Color = 'Red' WHERE v.Make = 'Tesla' AND v.Model = 'Model S'

Alice と Bob が同時にトランザクションを開始するとします。Alice の UPDATE ステートメントは VIN フィールドに対してインデックス付きのルックアップを行うため、該当する 1 つのドキュメントのみを読み取る必要があります。Alice は終了し、最初にトランザクションを正常にコミットします。

Bob のステートメントは、インデックス付けされていないフィールドをフィルタリングするため、テーブルスキャンを実行し、OccConflictException が発生します。これは、Alice のコミットされたトランザクションが Bob のステートメントがアクセスしているデータを変更したためです。これには、更新中のドキュメントだけでなく、テーブル内のすべてのドキュメントが含まれます。

挿入の OCC 競合

OCC の競合には、以前に存在していたドキュメントだけでなく、新しく挿入されたドキュメントも含まれます。次の図では、2 人の同時ユーザー (Alice と Bob) が台帳内の同じテーブルを操作しているとします。彼らは両方とも、述語値がまだ存在しないという条件の下でのみ新しいドキュメントを挿入したいと考えています。


                2 人の同時ユーザー間の競合例外の例を示す Amazon QLDB オプティミスティック同時実行制御 (OCC) の図。

この例では、Alice と Bob の両方が、以下を実行します。SELECTおよびINSERT1 つのトランザクション内のステートメント。アプリケーションでは、INSERTステートメントは、SELECTステートメントは結果を返しません。

SELECT * FROM Vehicle v WHERE v.VIN = 'ABCDE12345EXAMPLE'
INSERT INTO Vehicle VALUE { 'VIN' : 'ABCDE12345EXAMPLE', 'Type' : 'Wagon', 'Year' : 2019, 'Make' : 'Subaru', 'Model' : 'Outback', 'Color' : 'Gray' }

Alice と Bob が同時にトランザクションを開始するとします。どちらの SELECT クエリも、ABCDE12345EXAMPLE の VIN が付いた既存のドキュメントを返しません 。したがって、彼らのアプリケーションは INSERT ステートメントを続行します。

Alice は終了し、最初にトランザクションを正常にコミットします。その後、Bob はトランザクションをコミットしようとしますが、QLDB はそれをが拒否し、OccConflictException。これは、Alice のコミットされたトランザクションが Bob の SELECT クエリの結果セットを変更し、OCC が Bob のトランザクションをコミットする前にこの競合を検出するためです。

-SELECTこのトランザクションの例を以下にするにはクエリが必要ですべき等性。Bob は、最初からトランザクション全体を再試行することができます。しかし、彼の次はSELECTquery は、Alice が挿入したドキュメントを返すので、Bob のアプリケーションはINSERT

トランザクションをべき等にする

前のセクションの insert トランザクションも、べき等トランザクションの例です。つまり、同じトランザクションを複数回実行すると、同じ結果が得られます。ボブが走っている場合INSERT特定のものかどうかを最初にチェックせずにVINすでに存在する場合、テーブルは重複したドキュメントで終了する可能性があります。VIN値。

OCC の競合に加えて、他の再試行シナリオを考えてみます。たとえば、QLDB がサーバー側でトランザクションを正常にコミットできるが、レスポンスを待機中にクライアントはタイムアウトする可能性があります。同時実行または再試行の場合に予期しない結果を避けるために、ベストプラクティスとしては、書き込みトランザクションをべき等にしてください。

同時セッションの管理

リレーショナルデータベース管理システム (RDBMS) を使用した経験がある場合は、同時接続の制限をご存知かもしれません。トランザクションが HTTP リクエストメッセージとレスポンスメッセージを使用して実行されるため、QLDB には従来の RDBMS 接続とは概念が異なります。

QLDB では、同様の概念がアクティブなセッション。セッションは概念的にはユーザーログインに似ており、レジャーへのデータトランザクション要求に関する情報を管理します。アクティブなセッションとは、トランザクションをアクティブに実行しているセッションです。また、サービスが別のトランザクションをすぐに開始すると予想するトランザクションを最近終了したセッションでもかまいません。QLDB は、セッションごとに 1 つのアクティブ実行トランザクションをサポートします。

台帳ごとの同時アクティブセッションの制限数は、「Amazon QLDB でのクォータと制限」に定義されています。この制限に達すると、トランザクションを開始しようとするセッションはエラーになります (LimitExceededException).

セッションのライフサイクルと、データトランザクションの実行時に QLDB ドライバがセッションを処理する方法の詳細については、を参照してください。ドライバーによるセッション管理。QLDB ドライバを使用してアプリケーション内のセッションプールを設定するベストプラクティスについては、を参照してください。QLdbDriver オブジェクトの設定Amazon QLDB ドライバーの推奨事項