このページでは、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 トランザクションの詳細を確認する。