Hatena::ブログ(Diary)

@vvakame の日記

2011-10-06

複数EntityGroupに対するトランザクション処理が追加されたらしい

| 11:18 | 複数EntityGroupに対するトランザクション処理が追加されたらしいを含むブックマーク

appengine SDK 1.5.5 prerelease がリリースされました。

https://groups.google.com/forum/#!topic/google-appengine/f9YVplAlRs4/discussion

気になるのはこれ。

  • App Engine now supports Cross Group (XG) transactions with the High

Replication Datastore, which allow you to perform transactions across multiple

entity groups.

すごい!!複数EGに対してトランザクション処理が可能だって!?

appengineだと今まではひとつのEGしかトランザクションの対象に出来なくて、要するに関連性のない複数のレコードの更新がトランザクション下で達成することは出来ない感じになってました。

代表例としてよく言われるのは、銀行の口座間送金ですね。

口座Aからお金を引き落とす。

口座Bにお金を入金する。

をシンプルに1つのトランザクションとして処理することは出来なくて、口座Bへの入金が失敗したらTQで非同期でリトライするみたいな工夫が必要だったんす。

これがちゃんと何も考えなくてもトランザクション下で安全に処理できるようになった。みたいな。

で、ある処理を非同期でやるってのは結構めんどくさいです。

自動でTQを生成するための https://github.com/vvakame/appengine-deferred みたいなライブラリを作ったりもしてたんですが、どうやらかなりの場合に今回のXG transactionでまかなえるんじゃね?しかも同期的に処理出来ることを保証できるパターンが増えるんじゃね?

ってのが今回の(*´Д`)=3 ムッハー! ポイント

検証用コードを書いてみました。

https://gist.github.com/1264065

結果、DevelopmentServer(要するにローカルのエミュ環境)と実環境 共に5EGまで同時に扱えるみたいです。

6EGからは例外が発生すると。

java.lang.IllegalArgumentException: operating on too many entity groups in a single transaction.

ちなみに、HRD専用なのでM/Sを利用しているappIdは移行ツール使って新appIdにお引越ししなければならないみたいです。

面倒くさいけど、やる価値はあるなぁ…!

これは高まる…!(*´꒳`*)

後は11/1からの新料金プランがもちょい手加減してくれれば…(´ω`;)