トランザクションは、1 つ以上のエンティティに対する一連のオペレーションです。トランザクションのオペレーションは不可分で、部分的に実行されることはありません。トランザクション内のオペレーションは、すべて適用されるか 1 つも適用されないかのどちらかとなります。
トランザクションの使用
トランザクションは 270 秒後またはアイドル状態が 60 秒間続くと期限切れになります。
次のような場合は、オペレーションが失敗することがあります。
- 1 つのエンティティに対し、過剰な数の変更が同時に行われようとしている場合。
- トランザクションがリソース制限を超過している場合。
- Datastore モードのデータベースで内部エラーが発生した場合。
上記のいずれの場合も、Datastore API はエラーを返します。
トランザクションはオプション機能です。データベース オペレーションの実行のために、必ずしもトランザクションを使用する必要はありません。
アプリケーションは、ステートメントとオペレーションのセットを 1 つのトランザクションで実行できます。そのため、ステートメントまたはオペレーションのいずれかで例外が発生すると、そのセット内のデータベース オペレーションは一切反映されません。トランザクションで実行するアクションは、アプリケーションによって定義されます。
次のスニペットは、トランザクションを実行する方法を示しています。これは、ある口座のお金を別の口座に移すトランザクションです。
C#
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore C# API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Go
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Go API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Java
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Java API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Node.js
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Node.js API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
PHP
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore PHP API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Python
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Python API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Ruby
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Ruby API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
例をわかりやすく単純にするため、トランザクションが失敗した場合に rollback
を省略していることがあります。本番環境のコードでは、すべてのトランザクションが明示的に commit またはロールバックされるようにすることが重要です。
トランザクションで実行可能な処理
トランザクションでは任意の数のエンティティにクエリを実行したり、検索したりできます。 トランザクションの最大サイズは 10 MiB です。読み取り / 書き込みトランザクションまたは読み取り専用トランザクションを使用できます。
分離と整合性
Datastore モードのデータベースでは、シリアル化可能な分離が強制的に適用されます。つまり、トランザクションによって読み取られた、または変更されたデータを同時に変更することはできません。
トランザクション内の各クエリおよび検索は、データベースの状態の整合性のあるスナップショットを参照します。このスナップショットは、トランザクションの開始前に完了したすべてのトランザクションと書き込みの効果が反映されることが保証されています。
こうした一貫性のあるスナップショット ビューは、トランザクション内の書き込み後の読み取りにまで拡張されています。ほとんどのデータベースと異なり、Datastore モードのトランザクション内の query と lookup 処理は、トランザクション内の以前の書き込み結果を参照しません。つまり、トランザクション内でエンティティの変更または削除が行われてからクエリまたはルックアップを実行した場合、トランザクションを開始した当初のバージョンのエンティティが返されます。開始したときにエンティティが存在しなければ、何も返されません。
トランザクション以外でも、クエリと検索にはシリアル化可能な分離が適用されます。
同時実行モード
Datastore モードの Firestore では、3 つの同時実行モードがサポートされています。同時実行モードは、同時実行トランザクションの相互作用方法を決定するデータベース設定です。次のいずれかの同時実行モードを選択できます。
悲観的
読み取り / 書き込みトランザクションでは、分離とシリアル化を強制的に適用するために、リーダー / ライターロックが使用されます。2 つ以上の読み取り / 書き込みトランザクションを同時に実行して、同じデータの読み取りまたは書き込みを行う際には、一方のトランザクションでロックを保持して、他方のトランザクションを遅延させることがあります。トランザクションで書き込みが不要であれば、読み取り専用トランザクションを使用することで、パフォーマンスを改善して他のトランザクションとの競合を回避できます。読み取り専用トランザクションではロックは必要ありません。
Datastore モードの Firestore データベースは、デフォルトで悲観的同時実行モードを使用します。
楽観的
2 つ以上の同時読み取り / 書き込みトランザクションが同じデータを読み書きする場合、最初に commit されたトランザクションのみが変更を commit します。書き込みを実行する他のトランザクションは、commit 時に失敗します。
エンティティ グループによるオプティミスティック
この同時実行モードは、アプリが以前の Cloud Datastore のエンティティ グループのトランザクション セマンティクスに依存している場合にのみ使用してください。この同時実行モードでは、トランザクションに追加の制限が適用されます。
- トランザクションは 25 のエンティティ グループに制限されます。
- エンティティ グループへの書き込みは 1 秒あたり 1 回に制限されます。
- トランザクション内のクエリは祖先クエリでなければなりません。
OPTIMISTIC_WITH_ENTITY_GROUPS
のクエリ、トランザクション、書き込みスループットの制限を取り除くには、プロジェクトの同時実行モードを「楽観的」に変更します。この変更がプロジェクトに適合していることを確認するには、次の手順に従います。Datastore モードの Firestore でテスト プロジェクトを作成します。
テスト プロジェクトの同時実行モードを
OPTIMISTIC
に変更します。次に示すように、HTTP PATCH リクエストを発行します。テスト プロジェクトでテストを実行し、エンティティ グループがなくてもワークロードが期待どおりに動作することを確認します。
メイン プロジェクトの同時実行モードを
OPTIMISTIC_WITH_ENTITY_GROUPS
からOPTIMISTIC
に変更します。
同時実行モードを表示する
Firestore の projects.databases REST リソースを使用して、データベースの同時実行モードを表示します。
curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"
同時実行モードを変更する
データベースの同時実行モードを変更するには、PATCH
リクエストを Firestore の projects.databases REST リソースに送信します。
curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"concurrencyMode":"CONCURRENCY_MODE"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=concurrencyMode"
ここで
- CONCURRENCY_MODE は
PESSIMISTIC
、OPTIMISTIC
またはOPTIMISTIC_WITH_ENTITY_GROUPS
です。 - PROJECT_ID は、Google Cloud プロジェクトの ID です。
トランザクションの用法
トランザクションの用法の 1 つは、現在の値より新しいプロパティ値で、エンティティを更新することです。上記の transferFunds
の例では、2 つのエンティティに対してまさにこのオペレーションを実行しています。一方の口座からお金を引き出し、他方の口座に送金するというオペレーションです。Datastore API では、トランザクションの再試行は自動的に行われません。しかし、トランザクションを再試行するように独自のロジックを追加することはできます。たとえば、別のリクエストによって同一エンティティが同時に更新される場合に競合を処理するためなどです。
C#
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore C# API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Go
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Go API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Java
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Java API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Node.js
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Node.js API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
PHP
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore PHP API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Python
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Python API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Ruby
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Ruby API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
これにはトランザクションが必要です。このコードがオブジェクトをフェッチしてから、変更済みオブジェクトを保存するまでの間に、エンティティ内の balance
の値が別のユーザーによって更新されてしまう可能性があるからです。トランザクションを使用しないと、最初のユーザーのリクエストに対し、もう 1 人のユーザーによる更新前の balance
値が使用され、保存によって新しい値が上書きされてしまいます。トランザクションを使用することで、もう 1 人のユーザーによる更新がアプリケーションに通知されます。
トランザクションのもう 1 つの一般的な用法は、名前付きキーによってエンティティを取得することです。名前付きキーがまだ存在しない場合は、新規に作成します(次の例はエンティティの作成で使用した TaskList サンプルを基にしています)。
C#
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore C# API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Go
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Go API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Java
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Java API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Node.js
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Node.js API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
PHP
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore PHP API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Python
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Python API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Ruby
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Ruby API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
同じ文字列 ID を持つエンティティを別のユーザーが作成または更新しようとする状況に対処するには、前の例と同様にトランザクションが必要です。エンティティがまだ存在していない時点で 2 人のユーザーが同時にこれを作成しようとした場合、トランザクションを使用しなければ、先に作成されたエンティティは 2 人目のユーザーの操作により上書きされ、しかも 2 人ともエンティティが上書きされたことに気がづきません。
トランザクションが失敗した場合は、成功するまでアプリケーションにトランザクションを再試行させることができます。またはアプリケーションのユーザー インターフェース レベルまでエラーを伝達し、ユーザーにこのエラーを処理させることもできます。すべてのトランザクションに対し、再試行ループを作成する必要はありません。
読み取り専用トランザクション
これで、トランザクションを使用して、データベースの一貫性のあるスナップショットを読み取ることができるようになりました。こうした手法は、整合性が求められるページの表示やデータのエクスポートに、複数回の読み取りが必要となる場合に役立ちます。その場合には、読み取り専用トランザクションを作成できます。
読み取り専用トランザクションはエンティティを変更できませんが、その代わり、他のトランザクションと競合せず、再試行の必要もありません。通常の読み書きトランザクションで読み取りのみを実行すると、そのトランザクションは同一データを変更するトランザクションと競合することがあります。
C#
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore C# API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Go
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Go API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Java
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Java API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Node.js
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Node.js API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
PHP
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore PHP API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Python
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Python API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Ruby
Cloud Datastore 用のクライアント ライブラリをインストールして使用する方法については、Cloud Datastore のクライアント ライブラリをご覧ください。 詳細については、Cloud Datastore Ruby API のリファレンス ドキュメントをご覧ください。
Cloud Datastore への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
次のステップ
- クエリについて学習する。