play2.1のDB.withTransactionのバグ? #play_ja

0
なぞキング(親切さん) @nazoking

play2.1 の DB.withTransaction、 内部で return すると rollback も commit もしてくれないの・・

2013-03-04 01:01:42
なぞキング(親切さん) @nazoking

scalaのブロック内returnと例外の扱いはバグの温床になる気がする…… https://t.co/7wmeHguKGp

2013-03-04 01:08:09
Kenji Yoshida @xuwei_k

あーなるほど。どうなっているべきなんだろか https://t.co/idnwfinTFD https://t.co/avf70XlAvG ここ単にfinally内でrollbackするべきなのか、このままでいいのか、それとも・・・? #play_ja

2013-03-04 01:28:22
なぞキング(親切さん) @nazoking

@xuwei_k 少なくとも NonLocalReturnControl の場合はcommit してほしいです。 try{ block; commit }catch{ rollback } となっている事を期待しててreturnがcatchに行くとか思わなかったです。

2013-03-04 01:33:50
Yasushi Abe @yasushia

@xuwei_k おかしいですね。普通はfinallyにrollback書くような(txはcommit/rollbackで終了)。rollbackするexceptionもある程度カスタマイズ できたほうがいいような。springは→ http://t.co/T7haGFliM4

2013-03-04 01:35:58
Kenji Yoshida @xuwei_k

そういうのあるので「無名関数内でreturnすると内部的には https://t.co/Clw5imRXhQ ControlThrowableという例外投げてる」というのは"returnを使う初心者ほど"知っておく必要があるような https://t.co/B3932KJ8Wo

2013-03-04 01:36:27
Kenji Yoshida @xuwei_k

.@nazoking @yasushia pull req一覧 https://t.co/mLCPd45xO0 みたらなさそうだし、あとissueとかMLとか検索してみて、それでも見つからなかったら、MLで相談かpull reqしちゃったほうがいいですかね・・・ #play_ja

2013-03-04 01:41:07
なぞキング(親切さん) @nazoking

@xuwei_k 一応知ってたレベルだと「例外ならロールバックされるトランザクションがreturnでもロールバックされる」っていうところまで頭が回らなかったです(頭よぎったけどロールバックもされてなかったのではまった……)

2013-03-04 01:46:58
なぞキング(親切さん) @nazoking

@xuwei_k @yasushia rollbackかcommitか、どっちかはして欲しいですね

2013-03-04 01:48:11
Kenji Yoshida @xuwei_k

.@nazoking git blameしたら https://t.co/1umTmUkfYq 「とりあえず全部まとめてe: ExceptionをNonFatal(e)に置き換えたときのコミット」なので、これでバグ仕込んだ感・・・ #play_ja

2013-03-04 01:50:41
Yasushi Abe @yasushia

@nazoking @xuwei_k http://t.co/773kKtKi9t よく見てないですがこのcommitで漏れたようです。これ以前はfinallyでcloseしてるのでrollback相当になっていたはず。

2013-03-04 01:50:56
Yasushi Abe @yasushia

あ、いや。いいのか。これblockがclose呼ぶのかな。とするとコネクションプールの実装がアレだと浮いちゃうんだろうか

2013-03-04 01:53:45
Naoki Takezoe @takezoen

そーか、returnにはそんな罠が…。

2013-03-04 01:54:19
Kenji Yoshida @xuwei_k

playで catch{ case _:FooException=> //処理 case e=>throw e } とか catch{ case e =>/*処理*/ throw e } とか、前者は省略すればいいし後者はfinally使えばいいと思うのだけどなんなのだろう

2013-03-04 01:57:07
Yasushi Abe @yasushia

@nazoking @xuwei_k すいません。withConnectionのfinallyでcloseしてました。素朴なコネクションプールでなければcommitしてないtxはrollbackされると思われます

2013-03-04 01:57:57
Kenji Yoshida @xuwei_k

https://t.co/77SOg8te84 こうすると、ControlThrowable(scala.runtime.NonLocalReturnControl) をcatchできます

2013-03-04 02:02:01
Yasushi Abe @yasushia

http://t.co/l37d6kX78p closeでrollbackするかどうかは実装依存だったのか。

2013-03-04 02:02:32
なぞキング(親切さん) @nazoking

@yasushia @xuwei_k うーん確かに。しかしMySQLとインテグレーションテストの中ではどちらもされなかったです…まあcloseの説明に「トランザクションを明示的にコミットまたはロールバックすることを強くお勧めします」とあるのでして欲しい

2013-03-04 02:04:46
がくぞ @gakuzzzz

しかし、この問題 https://t.co/ADiSDqymiN Stackable-Controller も抱えてるんじゃないか?調べよう。明示的な return の場合はユーザの意図としては commit された方が嬉しいよね多分。

2013-03-04 02:16:04
がくぞ @gakuzzzz

眠いので日本語おかしい。 ユーザの意図としてはコミットされることを意図してるよね、普通。

2013-03-04 02:16:38
がくぞ @gakuzzzz

@xuwei_k 明示的に return している場合はユーザの意図としては正常に終了させたつもりだと思うので rollback より commit の方が適切じゃないかと思います。returnをExceptionで実現してるのはあくまで Scalaの実装の都合ですし

2013-03-04 14:59:05