[0] PostgreSQLの古い話。「autocommit」-[Id of Radiance ver.5]





■ PostgreSQLの古い話。「autocommit」

 PostgreSQLはデフォルトだと基本的にSQLを発行する度に自動的にcommitを行ってます。もちろん自分で明示的にトランザクションの開始→終了をすることもできますが、厳密に途中で何かがあったらまとめてRollbackとかするのでも無い限り自動でcommit行わせた方が楽と言えば楽です。

 で、その自動commitを制御する設定項目が「autocommit」。最近ではクライアント毎にそのon,offを設定できるようですが、バージョン7.3.4以前は基本的にサーバサイドで行う設定項目であり、postgresql.confでそのtrue,falseを決定するものでした。
 なので途中でPostgreSQLのバージョンを変えた場合、この設定項目の消滅がコーディングに影響してくる場合があります。

 …ええ、要するにあったんですよ。そう言う例が。
 他社の作ったシステムの改修作業で、最初は古いPostgreSQL使ってたのかautocommitがfalseで動いてたんだけど、どっかのタイミングでPostgreSQLのバージョンが上がってサーバ側のautocommit設定が消滅。デフォルトのtrue状態になったんだけど、しかしプログラム側には何の手も入れてなかったんで、トランザクションブロックのタイミングが変になり、「もう閉じてますよ」といった旨のトランザクション警告がガシガシ発生するようになった、ってカンジ。

 ただしよくよく見てみるとautocommitがfalse状態でもやっぱトランザクションの警告が発生してた。
 このautocommit、なんとなく「トランザクションの開始・終了を自動で実行するか否か」って設定な気がするけど、実際のところ項目名の示すとおり「commitを自動で実行するか否か」の設定ぽい。意識せずにSQLを実行した際のトランザクションのbeginはautocommitとは何の関係も無く実行されてる。なのでautocommitがfalseだと、いつまでもトランザクションが開いたままになるっぽい。その状態でもう一度begin を行おうとすると「もう開いてますよ」といった旨のトランザクション警告が発生する、という次第。commitだけはしっかり自分でやれ、と。

 どっちにしろこのシステム、開発段階からしてトランザクションブロックのタイミングがめちゃくちゃなのは確か。ただしよくよく見るとべーつに個々の SQL単位でトランザクション終わらしてもほとんど問題ない作りをしてる。基本明示的なbegin〜commit or rollbackを抑止する方向で進めてます。

関連タグ:PostgreSQL
2007-02-07 [技術・作業]

関連記事: