[Seasar-user:1767] PostgreSQLセッションの分断

加藤太朗 kato
2005年 4月 10日 (日) 19:31:44 JST


S2Daoを使っていて、気づいたことを報告します。

以前PostgreSQLのIDアノテーションについて "identity" 対応に
ついて大塚さんの対応例がアップされていました(Seasar-user:1487)。

実装方法は違いますが、大塚さんと同様に currval を使って
対応してみたところ、PostgreSQLセッションが異なる領域で実行され
たため、currvalは取得できない旨のエラーが発生しました。
調査したところ、daoのinsertメソッド実行の間で利用側が何かを
行っているということはなく、ログを見ても、S2Daoの中で、
1.insert文実行
2.currval取得実行
が成されているだけです。にも関らず、2.が1.に紐ついて
実行されていない状況です。

#関係ないかもしれませんが、
#サーバー構成としては、DBとアプリは別マシンに分かれています。

identityだけではなくsequenceの場合でも起きていると想像できます。
もし通常のsequenceを使った方法でも、nextvalで取得しておいたはずの値が、
INSERTの時点で他のユーザーのINSERTが同時に実行されて、失敗する
可能性があります。

DbEditプラグインなどでは問題が起きないので、S2Daoの場合だけ
セッションが分断されてしまっているということだと思います。
S2Daoを深く追いきれていませんが、もしかすると、同一のステートメントを
使っていないということでしょうか。

他のDBMSでも、知らず知らずに同様のことが怒っている可能性が
あります。SQLServerの @@identityも同じで、同一ステートメント
でなければアウトでしょうし。

もしかしたらトランザクション中であれば問題が起きない内容かも
しれません。そのあたりはまだ調査不足な面もありますが、
IDアノテーションに対する実装は、他のステートメント実行と
同様の方法ではなく、密接にしなければならないと思います。
(insert文自身に、直接続けてID取得SQLを書いてしまうなど)

この辺りで詳しい方、助言いただけると嬉しいです。

--------------------------------------------------------->>
Gluegent,Inc. T.Kato
http://package.gluegent.com/~kato/signature.xml
---->> generate products and services with high added value





Seasar-user メーリングリストの案内