このページでは、Spanner で再現可能な読み取り分離を使用する方法について説明します。
再現可能な読み取りは、トランザクション内のすべての読み取りオペレーションが、トランザクションの開始時点でのデータベースの一貫したスナップショットを参照することを保証する分離レベルです。Spanner では、この分離レベルはスナップショット分離とも呼ばれる手法を使用して実装されます。このアプローチは、多数のトランザクションが他のトランザクションによって変更される可能性のあるデータを読み取る、読み取り / 書き込みの同時実行性が高いシナリオで有効です。固定スナップショットを使用することで、リピータブル リードは、より厳密なシリアライズ可能な分離レベルのパフォーマンスへの影響を回避します。読み取りはロックを取得せずに実行でき、同時書き込みをブロックしないため、シリアル化の競合が原因で再試行が必要になる可能性のあるトランザクションの中止が少なくなる可能性があります。詳細については、分離レベルの概要をご覧ください。
分離レベルを設定する
読み取り / 書き込みトランザクションの分離レベルは、次の方法でデータベース クライアント レベルまたはトランザクション レベルで設定できます。
クライアント ライブラリ
Go
Java
Node.js
Python
REST
TransactionOptions.isolation_level REST API を使用して、トランザクション レベルで読み取り / 書き込みトランザクションと読み取り専用トランザクションの分離レベルを設定できます。有効なオプションは TransactionOptions.SERIALIZABLE と TransactionOptions.REPEATABLE_READ です。デフォルトでは、Spanner は分離レベルを直列化可能な分離に設定します。
制限事項
Repeatable Read 分離のプレビューには、次の制限事項があります。
- スキーマにチェック制約がある場合、問題が発生する可能性があります。
- チェック制約が検証されない既知の問題があります。この問題により、トランザクションの commit 時に制約違反が発生する可能性があります。そのため、スキーマにチェック制約がある場合は、プレビューで反復可能読み取り分離を使用することをおすすめしません。
- トランザクションの実行中にデータベースでスキーマの同時変更が発生すると、問題が発生する可能性があります。
- DML ステートメントで
last_statementオプションが使用され、DML ステートメントの実行中に同時スキーマ変更が発生すると、内部的に再試行され、last_statementオプションの設定後に DML が誤って再試行されたことを示すエラーが返されることがあります。スキーマの変更が適用された後にトランザクションを再試行すると、この問題は解決します。 - トランザクション内のリクエストでクライアントから
DEADLINE_EXCEEDEDエラーが発生した場合は、スキーマの変更が適用された後にトランザクションを再試行して問題を解決します。
- DML ステートメントで
サポートされていないユースケース
- パーティション化 DML トランザクションで繰り返し読み取り分離を設定することはできません。
- すべての読み取り専用トランザクションはすでに固定スナップショットで動作しており、ロックを必要としないため、このトランザクション タイプで繰り返し読み取り分離を設定しても動作は変わりません。
- Spanner クライアント ライブラリを使用して、読み取り専用、単一使用、パーティション オペレーションに反復可能読み取り分離を設定することはできません。Spanner クライアント ライブラリには、読み取り専用、単一使用、パーティション クエリ オペレーションに反復可能読み取り分離を設定するオプションはありません。
次のステップ
詳しくは、分離レベルをご覧ください。
Spanner の直列化可能性と外部整合性については、TrueTime と外部整合性をご覧ください。