コンピュータやソフトウェアのあれこれ@道民(&元道民)
gae
[python][GAE]Re: TransactionとEntity Groupについての理解
12月 26th
TransactionとEntity Groupについての理解で言及されていたことを試してみたのですが、どうも微妙に違うような?
つまりTransaction内では、(多分Keyに関する操作がある場合には)暗黙のうちに「Key.from_path(u'UserAccount', u'tagomoris')を親とするEntity Groupに対する操作」として扱われている、ということだろう。
このエントリの add_useraccount() が動作するのは、get_by_key_name に成功した場合は u = UserAccount.get_by_key_name(name) のEntity Group のみをTransaction 内で触っていることになり、get_by_key_name に失敗した場合は u = UserAccount(key_name=name, fullname=fullname) のEntity Group のみへの操作となるからな気がします。参照するEntity Groupと作成するEntity Groupは確かに別物で、Transaction内で同時に触ることができないってのも真なのですが、この例の場合だと参照と作成は同時に起きないってのがミソでしょう。
ということで、以下のようなコードを書けば、"Cannot operate on different entity groups in a transaction"となります。
def make_shadow(body_name, fullname): u = UserAccount.get_by_key_name(body_name) if u is None: raise db.Rollback u = UserAccount(key_name=u.key().name() + "_shadow", fullname=fullname) u.put() return u user = UserAccount(key_name="hiratara", fullname="Masahiro Honma") user.put() new_user = db.run_in_transaction(make_shadow, "hiratara", "Shadow Honma")
BadRequestError: Cannot operate on different entity groups in a transaction: (kind='UserAccount', name='hiratara') and (kind='UserAccount', name='hiratara_shadow').
[Java][AppEngine][gae] 開発サーバの起動引数メモ
12月 8th
GAE/Jの開発サーバの起動引数とappengine-web.xmlに関して、ちょっとはまっていたのでメモしておきます。 GAE/Jの開発サーバは、 com.google.appengine.tools.development.DevAppServerMain をエントリーポイントとします。これは通常のエントリーポイントの実行ですから、Javaの実行オプションを指定することができます。一方、プロダクションサーバではエントリーポイントや起動方法については開発者は触ることができません。しかし、起動引数につ ...
[Java][AppEngine][gae] makeAsynCallをサーバ上で実行させる
11月 28th
Google App Engineの各サービス(Datastore,Mail,Memcahe…)はプロダクションサーバで実行されるときにGoogleのサーバ群のどこかで実行されています。この時に使われている通信プロトコルがプロトコルバッファと呼ばれるもので、バックエンドのサービスに対して何かをしたい場合に重要な部分となります。 一方、GAEの開発環境は秀逸です。本来はDatastoreなどもGoogleのサーバ上でしか動かないサービスなのですが、開発環境ではエミュレートされているため、本番サーバでなけ ...