このページでは、Spanner のバッチ書き込みリクエストと、そのリクエストで Spanner データを変更する方法について説明します。
Spanner のバッチ書き込みを使用すると、Spanner テーブルで複数行の挿入、更新、削除を実行できます。Spanner のバッチ書き込みは、読み取りオペレーションのない低レイテンシの書き込みをサポートし、ミューテーションがバッチに適用されるときにレスポンスを返します。バッチ書き込みを使用するには、関連するミューテーションをグループ化します。グループ内のすべてのミューテーションはアトミックに commit されます。グループ間のミューテーションは不特定の順序で適用され、互いに独立しています(非アトミック)。Spanner は、すべてのミューテーションが適用されるのを待たずにレスポンスを送信できます。つまり、バッチ書き込みでは部分的な失敗が許容されます。複数のバッチ書き込みを一度に実行することもできます。詳細については、バッチ書き込みの使用方法をご覧ください。
ユースケース
Spanner のバッチ書き込みは、読み取りオペレーションを行わずに多数の書き込みを commit する必要があり、すべてのミューテーションでアトミック トランザクションを必要としない場合に便利です。
DML リクエストをバッチ処理する場合は、バッチ DML を使用して Spanner データを変更します。DML とミューテーションの違いの詳細については、DML とミューテーションの比較をご覧ください。
単一のミューテーション リクエストでは、ロック型読み取り / 書き込みトランザクションの使用をおすすめします。
制限事項
Spanner のバッチ書き込みには次の制限があります。
Google Cloud コンソールまたは Google Cloud CLI では Spanner のバッチ書き込みを使用できません。REST API と RPC API、または Spanner クライアント ライブラリでのみ使用できます。
バッチ書き込みを使用したリプレイ保護はサポートされていません。ミューテーションは複数回適用される可能性があり、複数回適用されたミューテーションは失敗する場合があります。たとえば、挿入ミューテーションがリプレイされると、すでに存在するというエラーが生成されることがあります。ミューテーションで生成されたタイムスタンプベースのキーまたは commit タイムスタンプベースのキーを使用すると、テーブルに行が追加されることがあります。この問題を回避するには、書き込みをべき等になるように構成することをおすすめします。
完了したバッチ書き込みのロールバックはできません。進行中のバッチ書き込みリクエストはキャンセルできます。進行中のバッチ書き込みをキャンセルすると、完了していないグループのミューテーションはロールバックされます。完了したグループのミューテーションはデータベースに commit されます。
バッチ書き込みリクエストの最大サイズは、commit リクエストの上限と同じです。詳細については、データの作成、読み取り、更新、削除に関する上限をご覧ください。
バッチ書き込みの使用方法
バッチ書き込みを使用するには、変更するデータベースに対する spanner.databases.write
権限が必要です。REST または RPC API リクエスト呼び出しを使用すると、1 回の呼び出しでミューテーションを非アトミックでバッチ書き込みできます。
バッチ書き込みを使用する場合は、次のタイプのミューテーションをグループ化する必要があります。
- 親テーブルと子テーブルの両方で同じ主キーの接頭辞を持つ行の挿入。
- テーブル間に外部キーの関係のあるテーブルへの行の挿入。
- データベース スキーマとアプリケーション ロジックに依存する他のタイプの関連ミューテーション。
Spanner クライアント ライブラリを使用してバッチ書き込みを行うこともできます。次のコード例では、新しい行で Singers
テーブルを更新します。
クライアント ライブラリ
Java
Go
ノード
Python
C++
次のステップ
- Spanner トランザクションの詳細を確認する。