_)mどうもこんにちわ!マツウラです。今回はオペレーションを確実に実行するため用いるトランザクションについてです。それではGo言語での使い方について見てゆきます。Engineではトランザクションがサポートされています。トランザクションは完全に成功、または失敗することが保証された単一のオペレーションまたはオペレーションセットです。アプリケーションは単一のトランザクションで複数のオペレーションや計算を実行することが可能です。トランザクションの実行にはdatastore.RunInTransactionを使用します。次の例は単純なリクエスト回数をカウントする際にトランザクションを用いたコードです。上記のサンプルはトランザクションを出来るだけ簡単に表現するために書かれたコードです。カウンター操作のベストプラクティスでは無いので注意してください。RunInTransactionがトランザクションのコミットを試み、成功した場合はnilが返されます。nil以外のerror値を返した場合、データストアの変更は適用されず、RunInTransactionはそのエラーと同じエラーを返します。次のような場合はエラーを返します。同一のエンティティグループで大量の同時変更が行われているトランザクションのリソース制限を超えたデータストアの内部エラーが発生したべき等トランザクションでもべき等となるように注意して実装します。トランザクションの競合によりコミットが失敗すると、RunInTransactionは関数をリトライします。そのため、関数内で関数外のmapやsliceを操作しているような場合では、リトライのたびに値が変化してしまいます。十分に注意してください。トランザクションの制限データストアは単一のトランザクション内で可能なことに制限を掛けています。単一のトランザクションで複数のエンティティに対して適用する場合、属するエンティティグループが最大で5つまでに制限されています。複数のエンティティグループを組み合わせてトランザクションを実行するにはTransactionOptionsが必要になります。taskをQueueに格納するトランザクションの一部としてタスクをQueueに積むことが出来ます。一度Queueに積まれてもTaskは即座に実行されるとは限らず、トランザクションのようにアトミックでもありません。一度Queueに積まれればTaskは成功するまで再試行されます。これはRunInTransaction関数で積まれた全てのTaskに適用されます。taskは購入確認のEメール送信など、成功保証が必要な処理との組み合わせでも便利です。トランザクションが成功した場合に限って、トランザクション外部のエンティティグループに変更をコミットするなど、トランザクションにデータストア操作を結びつけることが出来ます。tasksを積むことは出来ません。tasksはユーザーが指定した名前を持つことも出来ません。EngineでのGo言語によるトランザクションの基本的な使い方などについてでした。トランザクションを試している際に個人的にちょっと躓いた部分がありました。親無しのエンティティを大量に用意してPutMultiで格納しようとしてエラーになったことです。true})上記のコードを実行すると次のようなエラーが出力されました。transaction.親を持たないエンティティはグループに属さないので関係無いと思っていたら、それぞれが独立したグループなんですねこれ。DatastoreのGo言語環境で特有の箇所があれば、見てゆきたいと思います。(2)月別アーカイブリンクはてなブログブログをはじめる週刊はてなブログはてなブログPro参加グループプログラミングテクノロジーはてなブログをはじめよう!knightsoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。