2010年11月23日火曜日

Slim3のGlobalTransaction

今更感がすごいあるけど、Slim3のトランザクションについてメモ。
まずは、普通のトランザクション。

public void update(final Key key) {
    // トランザクション開始
    final Transaction tx = Datastore.beginTransaction();
    fianl Model model = Datastore.get(tx, Model.class, key);

    mode.setName("hoge");
    Datastore.put(model)

    // コミット
    tx.commit();
}

GAEはデフォルトのトランザクションだと、単一のエンティティにしかトランザクションを貼れない。
でも、複数のエンティティを一緒に更新したい時ってのがあるわけで、そういう時に
使用するのが、グローバルトランザクション。

public void update(final Key hogeKey, final Key fugaKey) {
    // トランザクション開始
    final GlobalTransaction gtx = Datastore.beginGlobalTransaction();
    fianl HogeModel hogeModel = gtx.get(HogeModel.class, hogeKey);
    fianl FugaModel fugaModel = gtx.get(FugaModel.class, fugaKey);

    hogeModel.setName("hoge");
    fugaModel.setName("fuga");
    gtx.put(hogeModel, fugaModel)

    // コミット
    gtx.commit();
}

上記の様にすれば、複数のエンティティにまたがる処理を同一トランザクションで処理出来ます。
ちなみに、上記で使用しているputメソッドの引数は可変長引数なので、
2つ以上のエンティティの更新が可能です。

ここで、注意して欲しいのがqueryメソッドはトランザクションのサポート外ってところ。
なので、エンティティのプロパティにKeyを生成するための文字列を持たせておくのが
ベターでしょうか。(更新時等にKeyでエンティティを取得できるようにするため)

0 件のコメント:

コメントを投稿