[pgsql-jp: 41261] Re: 「LOCK TABLEはトランザクションブロック内でのみ」のエラー
Tomoaki Sato
sato @ sraoss.co.jp
2012年 10月 28日 (日) 11:50:50 JST
佐藤です。
> はじめまして、小澤と申します。
> PostgreSQL はあまり使う機会が無かったので、
> 実務期間数か月の初心者です。
>
> 数年前に作成されたサイトのメンテナンスをしております。
>
> 本番環境の DB は、更新することが出来ないので、
> ローカルに開発環境を作って、修正作業を行っています。
>
> 本番環境と開発環境の、PostgreSQL のバージョンの違いによって
> 困っています。
>
> PHP で、「LOCK TABLE 〜 」という処理があるのですが、
>
> 本番環境は問題なく実行できますが、開発環境で、下記のエラーがでます。
>
> SQL エラー:
> ERROR: LOCK TABLEはトランザクションブロック内でのみ使用できます
>
> LOCK TABLE をトランザクションの BEGIN と COMMIT の中に
> 入れなさい、ということおt思います。
はい、そのとおりです。
> 本番環境は、Linux バージョンは 7.3.4
> 開発環境の、Windows バージョンは 8.4.4
>
> 7.3.4 の頃には、トランザクション処理が無かったのか、
> LOCK TABLE との関係が定義されてなかったのかもしれません。
PostgreSQL 8.4 でトランザクションブロック外の LOCK 文がエラーになるよ
うに変わったためです。
> 開発環境の PostgreSQL のバージョンを 7.3.4 にしようと思い、
> 探したのですが、Windows 版はもう無いようです。
PostgreSQL が Windows に対応したのは 8.0 なので、7.3 の Windows 版は探
してもありません。
> 下記のことを教えて下さい。
>
> 1.開発環境の PostgreSQL の設定で、このエラーを出ないようにする
> 方法はないでしょうか。
そういった方法はありません。
> 2.Windows 版の PostgreSQL のバージョンを 7.3.4 が、
> どこかにないでしょうか。
前述のとおりです。
開発環境を Linux (Windows 上の仮想環境でも可) に変えて PostgreSQL 7.3
を入れるか、8.4 より前のバージョンの Windows 版を入れるのがよいと思い
ます。
ダウンロードできる最も古いバージョンの Windows 版は 8.2 系列のようです。
http://www.postgresql.org/ftp/binary/v8.2.23/win32/
ただ、メジャーバージョンが違うと LOCK 文以外にも互換性のない部分がある
ので気をつけてください。
> 尚、ソースにトランザクション処理を追加するという方法も考えましたが、
> 修正箇所が多いので、難しいです。
----
Tomoaki Sato <sato @ sraoss.co.jp>
SRA OSS, Inc. Japan
pgsql-jp メーリングリストの案内