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