過去の投稿記事 new!
・【画像】漫画でわかる外国人参政権
・東京電力のHPで停電状態が確認できたり(サービス再開!)
・戦国時代 ~ 江戸時代の徳川家康が熱かった
・vaio のバッテリは寿命が短いような気がする
・話題の Western Digital 製 WD20EARS を購入した
・C01LC をビックカメラで買ってきた
・2025年には空中都市が現実化?!
・【動画】わかりやすい「宇宙ひも理論」
・今世紀には「富士山噴火」「東海連動地震」「首都圏直下型地震」か?
・滅びた町、南浜町が Googleストリートビューで見れる

【 amazon 送料無料キャンペーン 】

バックリンクはご自由にどうぞ!     http://mfsocket.blogspot.com/feeds/posts/default?alt=rss リンク集 / ログイン

2011/04/19
【GAE】トランザクションの使い勝手

 
Google App Engine でトランザクションを利用してみたのだが、イメージ
していた通りには利用できない仕様だ。
 
例えばデータ追加のフローとして
 
1. トランザクション開始
 
2. データ追加
 
3. データ追加
 
4. トランザクション終了
 
ソースだとこんなイメージ。
gae_jdo_code01
 
Google のサンプルコードを若干拡張を行い、ループで挿入しようとした。
 
上記を行うと3番目の段階で、下記の例外が発生する。
 
javax.jdo.JDOFatalUserException: Illegal argument
NestedThrowables:
java.lang.IllegalArgumentException: can't operate on multiple entity groups in a single transaction. found both Element {
 
Google App Engine のヘルプを参照した所、これは仕様だった。
 
アプリケーションは、1 つのトランザクションで何度もエンティティの作成や更新を行うことはできません。1 つのトランザクションから同じエンティティを複数回更新しようとすると(makePersistent() コールの繰り返しなど)、JDOFatalUserException が発生します。その代わり、トランザクション内の
永続オブジェクトのみを変更し、変更を適用する commit() へのコールを許可します。
 
仕様に沿ったコードに変換したところ、例外は消えた。
gae_jdo_code02
 
一つのトランザクションで、連続してデータを挿入したい場合の回避策はきっと
あるのだろうが、検証するのが少しだるいかも。

0 コメント:

  • コメントには <b>, <strong>, <em>, <i>, <a> など一部の HTML タグを使用できます。