[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 メーリングリストの案内