ImplicitTransactionManagementPolicyについて

1
佐々木竹充/SASAKI TAKERU @urekat

ImplicitTransactionManagementPolicyってデフォルトはどっち?どこで指定するの? #appengine

2010-01-07 18:15:44
WdWeaver @WdWeaver

@urekat こう?デフォルトはAUTOだった気がする http://bit.ly/5Xmv92 #appengine

2010-01-07 18:33:16
佐々木竹充/SASAKI TAKERU @urekat

@WdWeaver おおそれです。はじめに設定するのかー。DatastoreServiceのインスタンスを2個取るとかもありか。意味あるか知らんけど。

2010-01-07 20:06:49
佐々木竹充/SASAKI TAKERU @urekat

ImplicitTransactionManagementPolicyのNONEはtxなしで複数putした場合に一部のエンティティだけが更新されるかもしれないということ?AUTOは全部更新or全部そのまま。1件putの場合は違いなし。であってる? #appengine

2010-01-07 20:12:52
佐々木竹充/SASAKI TAKERU @urekat

delete(keys)で500件とか削除しようとしてタイムアウトのエラーになったけど途中まで消えてた。ってことはあったからデフォルトNONEか? #appengine

2010-01-07 20:20:19
higayasuo @higayasuo

@urekat ImplicitTransactionManagementPolicyのAUTOとNONEはjavadoc通り、current txなしで、putやdeleteを呼び出したときにtxスコープで呼び出されるかどうか #appengine

2010-01-07 20:35:32
higayasuo @higayasuo

ImplicitTransactionManagementPolicyがAUTOのとき、current txがあり、tx引数ありのputやgetをtxに明示的にnullを指定して呼び出しても自動的にtxが開始される #appengine

2010-01-07 20:37:35
higayasuo @higayasuo

ImplicitTransactionManagementPolicyがAUTOで自動生成されたtxはメソッドの呼び出しが終わるときに自動的にコミットされる #appengine

2010-01-07 20:38:10
佐々木竹充/SASAKI TAKERU @urekat

@ashigeru keyの配列を作って、トランザクション指定なしでdelete(keys)した感じです

2010-01-08 01:44:39
Suguru ARAKAWA @ashigeru

@urekat 手前で提示されてたように、トランザクションスタックのトップを使ってればAUTOで、そうでなければNONEってことですよね>implicit tx policy

2010-01-08 01:51:51
佐々木竹充/SASAKI TAKERU @urekat

@ashigeru AUTOだとすれば、delete(keys)が自動的に作られるtxの中で実行されるので途中までってことはないはず。あと、AUTOで自動tx使ってたとしてもcurrentTxはdeleteからもどる前にcommitされているのでtx stackには現れないすよね

2010-01-08 02:13:56
Suguru ARAKAWA @ashigeru

@urekat AUTOでさらにJavadocを信用するなら、複数のEGに対するdeleteは失敗してほしいですね。ちょっとこっちでも実験してみます

2010-01-08 02:18:17
佐々木竹充/SASAKI TAKERU @urekat

@ashigeru tx stackてのはgetActiveTransactionsで見える範囲での話

2010-01-08 02:18:27
Suguru ARAKAWA @ashigeru

@urekat あ、もしかして自動Txってのの解釈が私と @urekat さんで異なってるかも。その辺含めて検証してみます

2010-01-08 02:19:44
佐々木竹充/SASAKI TAKERU @urekat

@ashigeru 自動tx=ImplicitTransactionManagementPolicyがAUTOのときにdelete/get/putの内部で勝手に始まって、終わってから返ってくるtxのことをいってます。で、たぶん途中まで消えた現象はNONEな環境でやってます

2010-01-08 02:25:27
佐々木竹充/SASAKI TAKERU @urekat

currentTx, 明示的に渡すtx, AUTOの時に使われる見えないtx の3つがある。であってるかしら。 #appengine

2010-01-08 02:28:22
佐々木竹充/SASAKI TAKERU @urekat

@ashigeru トランザクションスタックのトップはcurrentTxですね

2010-01-08 02:31:23
Suguru ARAKAWA @ashigeru

@urekat 私もその理解。Javadocを何度読んでもそうですね > "currentTx, 明示的に渡すtx, AUTOの時に使われる見えないtx の3つがある"

2010-01-08 02:33:52
Suguru ARAKAWA @ashigeru

@urekat なので、複数EGにまたがるdeleteをbatchで実行した場合、AUTOなら常に失敗してほしい。NONEなら部分的に失敗してもいい、って感じです

2010-01-08 02:35:14
Suguru ARAKAWA @ashigeru

@urekat 動作はあきらかにNONEでした。"DatastoreConfig.DEFAULT.getImplicitTransactionManagementPolicy().toString()"でも確認できます #appengine

2010-01-08 02:40:52
Suguru ARAKAWA @ashigeru

@urekat ついでにAUTO渡したら期待する動きになりました。トランザクションスタックが空で、 "delete(k1, k2)" やったらエラーに。 #appengine

2010-01-08 02:45:35
佐々木竹充/SASAKI TAKERU @urekat

#appengine tips RT @ashigeru: @urekat 私もその理解。Javadocを何度読んでもそうですね > "currentTx, 明示的に渡すtx, AUTOの時に使われる見えないtx の3つがある"

2010-01-08 02:45:55
Suguru ARAKAWA @ashigeru

@urekat ImplicitTransactionManagementPolicyのドキュメントにくどいくらい書いてありますが、Txスタックが空で複数EGに対するbatchオペレーションしたときも、作成されるTxは一つだけらしいです。これは確実にエラーになります。

2010-01-08 02:48:59
佐々木竹充/SASAKI TAKERU @urekat

@ashigeru http://bit.ly/5E1S2b くどい該当箇所はこれ。AUTOを選んでいてもtxを渡すget/put/deleteにtx=nullを渡せばtx無しで実行できるぽい。

2010-01-08 03:02:41