fc2ブログ

2011-11-12(Sat)

GAE/J エンティティーグループでトランザクションしてみる

GAE/JでACIDを保証するためエンティティーグループトランザクションを使ってみる。
ちなみに、Slim3環境だけどね。
(実験)
(1). ParentエンティティーとChildrenエンティティーを作成。
(2). それぞれのエンティティーは以下のデータを登録する。
 登録するときにChildrenはParentsのエンティティーグループとして登録する。
 
(name, older) -> ("oya1", 60), ("oya2", 50)
 
(name, older) -> ("children1", 2), ("children2", 5)
(3). Parentエンティティーを以下の通り変更しputした後、Childrenを変更しようとした時にエラーを発生させる。

(name, older) -> ("oya1", 61)
(4)."oya1"が60のままなことを確認する。

Controllerだけ記載するしておく。
言葉でメモるよりソースが一番理解できる。

public class ChildrenController extends RestController{
private final static Logger LOG = Logger.getLogger(ChildrenController.class
.getName());

@Override
public void doGet() {
response.setContentType("application/json");
String reg = param("reg");
String oya = param("oya");
String name = param("name");
String older = param("older");
String update = param("update");
String cname = param("cname");
String colder = param("colder");
String pname = param("pname");
String polder = param("polder");

if(null != reg){
/** Childrenデータ登録用 */
LOG.info("reg");
this.regChildern(oya, name, Integer.valueOf(older));
}else if(null != update){
/** 更新用 */
LOG.info("update");
/** トランザクション設定 */
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Transaction txn = datastore.beginTransaction();
/** Parentsエンティティーのolder更新 */
if(SC_OK != this.updateParents(txn, pname, Integer.valueOf(polder)) ){
txn.rollback();
return;
}
/** Childrenエンティティーのolder更新 */
if(SC_OK != this.updateChildern(txn, cname, Integer.valueOf(colder)) ){
/** ここでエラーを発生させてロールバックさせる */
txn.rollback();
return;
}
/** トランザクション終了 */
txn.commit();
}

return;
}


/* Childrenデータ更新処理 */
private Integer updateChildern(Transaction txn,String name, Integer older){
ChildrenDao insChildrenDao = new ChildrenDao();
Children entity = insChildrenDao.getEntity(name);
if(null == entity.getId()){
LOG.severe("ERROR");
return SC_NOT_FOUND;
}
entity.setOlder(older);
insChildrenDao.save(entity);

return SC_OK;
}
/* Parentsデータ更新処理 */
private Integer updateParents(Transaction txn,String name, Integer older){
ParentsDao insParentsDao = new ParentsDao();
Parents entity = insParentsDao.getEntity(name);
if(null == entity.getId()){
LOG.severe("ERROR");
return SC_NOT_FOUND;
}

entity.setOlder(older);
insParentsDao.save(entity);
return SC_OK;
}

/** Childrenデータ登録処理 */
private Integer regChildern(String oya, String name, Integer older){
ParentsDao insParentsDao = new ParentsDao();
Parents entity = insParentsDao.getEntity(oya);
if(null == entity.getId()){
LOG.severe("ERROR");
return SC_NOT_FOUND;
}

/** エンティティーグループ生成 */
/** ParentsのKeyを取得 */
Key parentKey = entity.getId();

/** 取得したParents Keyを今から生成させるChildren Keyにリンクさせる */
Key childKey = Datastore.allocateId(parentKey, Children.class);

/** Childrenデータ登録処理 */
ChildrenDao insChildrenDao = new ChildrenDao(childKey, name, older);
insChildrenDao.saveserlf();
return SC_OK;
}
}


参考:
Google App Engine(トランザクション)
すっきりわかるGoogle App Engine for Javaクラウドプログラミング
はじめてのGoogle App Engine for Java―巨大サーバを利用したWebアプリ開発の基本! (I/O BOOKS)
関連記事
スポンサーサイト



コメントの投稿

管理者にだけ表示を許可する

コメント

プロフィール

kumagonjp2

Author:kumagonjp2
Python,Django,R,Mongo,MySQL,Struts,Spring,データマイニングなどサーバー関係のメモを残していきます。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
雪が3Dで降るブログパーツ ver2

マウスで見る方向変えられます

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR