• 締切済み

PostgreSQL LOCK TABLE

はじめまして、小澤と申します。 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 のバージョンを 7.3.4 にしようと思い、 探したのですが、Windows 版はもう無いようです。 下記のことを教えて下さい。 1.開発環境の PostgreSQL の設定で、このエラーを出ないようにする 方法はないでしょうか。 2.Windows 版の PostgreSQL のバージョンを 7.3.4 が、 どこかにないでしょうか。 尚、ソースにトランザクション処理を追加するという方法も考えましたが、 修正箇所が多いので、難しいです。 メーリングリストにも出してます。マルチキャストですみません。 以上、宜しくお願いします。

みんなの回答

  • taco0603
  • ベストアンサー率63% (21/33)
回答No.2

はじめまして。 ご質問の回答ではありませんが、 >本番環境は、Linux バージョンは 7.3.4 >開発環境の、Windows バージョンは 8.4.4 開発環境が中途半端に新しく?、どういう意図でヴァージョン違い、OSも異なるもので開発されているのか読み取れませんがこれでは有効なテストにならないと思います。 ヴァージョンやOS差異によるバグや制限をテスト時に拾うことができませんよ。 本来であれば本番と全く同じハード・ソフト環境を用意すべきでしょうが、少なくともVmware Playerなどの仮想環境を用意してデータベースは本番と同じ環境にすできではないかと。

oozawa
質問者

補足

私、Linux サーバーのことは殆んど分かりません。 Windows の環境で開発し、Linux にアップして運用ということをしています。 Vmware Player を調べ、使ってみたいと思います。 尚、質問した件は、Windows 用の PostgreSQL を バージョンは 8.2.2 にしたら、 エラーが出なくなりましたので、解決とさせていただきます・

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

1. PostgreSQLって、デフォルトで自動コミットされてしまう設定だったと思うけど。 SET AUTOCOMMIT で調べてみると開発環境と本番環境で違っているのでは? と疑問に思ってしまいます。 2. PostgreSQLの7系でWindows版ってあったかな? (あったかもしれません。他の回答を当たってください。  私は、下のような話だったので手出ししなかったというだけですが。) (Wikiからの引用で悪いけど) Windowsにおいては、バージョン7.4以前はCygwinを必要としたが、バージョン8.0以降はネイティブで動作する。 (引用元) http://ja.wikipedia.org/wiki/PostgreSQL#.E3.83.97.E3.83.A9.E3.83.83.E3.83.88.E3.83.95.E3.82.A9.E3.83.BC.E3.83.A0 ついでに、Cygwinってなに? (これもWikiから) Cygwin (シグウィン) は、Microsoft Windowsオペレーティングシステム上で動作するUNIXライクな環境の一つである。フリーソフトウェアである。 (引用元) http://ja.wikipedia.org/wiki/Cygwin

oozawa
質問者

お礼

ありがとう、ございました。 質問した件は、Windows 用の PostgreSQL を バージョンは 8.2.2 にしたら、 エラーが出なくなりましたので、解決とさせていただきます。 Cygwin もやってmたいと思います。

関連するQ&A

  • Oracle→Postgresql 移行について

    あるWebアプリのDBをOracleからPostgresqlへ移行中なのですが、 トランザクション処理でエラーが発生します。 エラーコード:25006 メッセージ:リードオンリーのトランザクションでは UPDATE を実行できません Oracleでは正常にトランザクションが処理されてPostgresqlではできないということがあるのでしょうか。 類似の問題に経験のある方はご教授をお願い致します。 ちなみに、OracleとPostgresqlのバージョンは下記の通りです。 Oracle:11g Postgresql:9.2

  • PostgreSQL初心者です。助けてください。

    PostgreSQLを使用し、PHPプログラムから・・・ プログラム記述をミスしてしまい。 トランザクションを終了できないままテーブルがロックされてしまいました。 bigin を実行し lock table しましたが 何と commit 文が注釈に なっており、テーブルがロックされたままの状態になってしまいました。 drop table もできなくなっています。 とにかくこのロック状態を解消したいのですが・・・ よろしくご教授ください。

  • postgresqlでのトランザクションについて

    postgresqlで、「WARNING  進行中のトランザクションがありません」のエラーが出てしまいました。 これはそのままの意味だと思うのですが 直す方法がわかりません。 ワーニングなので、、、といいたいところですが、そうもいかず。 apのログで、トランザクション関係の辺りを見ましたところ、 トランザクションを開始し、 TABLEをDROPしようとしましたが、存在しなかった(ようだ)。 (PQexecがエラーでリターン) 存在しないけれど、commit してトランザクションを終わらせている。 のが原因かなと思いました。 なので、PQexec()がエラーの場合はcommitしなければいいのかと はずしましたが結果は同じでした。 トランザクションが無いのだからrollbackもいらないですよね。 そこで質問ですが drop文、1ステップのSQL実行も明示的にトランザクションの処理をしたほうがいいのでしょうか? このワーニングは通常のトランザクションの処理の中で、どういう時にでるのでしょうか? oracleとpostgresqlの明示的・暗黙的な制御に戸惑っています。 (oracleからpostgresqlに移行することになりました) 叱咤でも何でもかまいませんので、アドバイスよろしくお願いいたします。

  • PostgreSQL

    これから、PHP4&PostgreSQLでサイト開発を行いたいと 考えています。 一応、RED HAT Linuxのサーバーは設置してありますが、 作業の効率(使い慣れているだけ・・)を考えると、windows上で開発して、サーバーに移植したいと考えています。 WINDOWSマシンにはApacheをインストールしてあります。 PHP4については、Win32バージョンがあることは確認しましたが、PostgreSQLについては、Win32バージョンは存在しているのでしょうか? 書籍にはあるらしき事が記載されていましたが、どこからダウンロードできるかが分かりません。 もし、ご存知の方がいらっしゃれば、そのサイトを教えて頂けませんでしょうか? 宜しくお願い致します。

  • 行のロックについて

    PHPとPostgreSQLで商品検索のWebシステムを構築しております。 ロックについて質問なのですが、管理者が商品情報を修正する場合次の手順となります。 1.商品一覧より修正したいデータ(行)を選択。するとフォームに現状の値が入力されたページに移行。 2.フォームから修正したい箇所のみ変更し登録実行。 この手順の間、例えばフォーム上でデータを修正している間に、他の管理者がデータを修正した場合や、 データを削除した場合、不整合やエラーが起こると考え「修正目的でデータを取得した場合は、修正が完了する までその行をロックし、参照以外できない。」というような事を考えたのですがPostgreSQLの機能で可能でしょうか? 「行ロック」が該当するのかと思いインターネットや書籍で調べてみたのですが、トランザクション毎に行なうもののようで長期的なロック目的のものではないと認識しております・・・。 よろしくお願いします。

  • 排他ロックしたレコードが、別トランザクションから参照されてしまい困っています。

    SQL Server2000を使用し、 あるトランザクションで排他ロック(XLOCK)をかけたレコードが 他のトランザクションから共有ロックを使用し参照できてしまう状態は存在するのでしょうか? 排他ロックをかけたレコードが 他のトランザクションから参照できてしまい困っています。 現在、下記の環境で開発を行っております。 ・サーバ側 Windows Server2003 SQL Server2000(sp4) ・クライアント側 Windows Xp(sp3) jdk6.0 jdbc 3.0 Type4 以下が具体的な状況となります。 前提として、 ・二つのトランザクション(以下A、Bと表記します)が存在する。 ・AとBは別のユーザでコネクションを張っている。 ・autoCommitはfalseに設定している。 ・テーブルにプライマリキーやインデックスは張っていない。 ・レコードは10件。 ・分離レベルはREAD COMMITED (1)Aから、「SELECT * FROM TEST_TABLE WITH(XLOCK) 」を発行 (2)Bから、「SELECT * FROM TEST_TABLE」を発行 このような状況で、(1)、(2)の順で処理を行った場合に 私の認識では、(2)の検索時にタイムアウト等が発生するという認識です。 しかし、(2)のSQLは正常に終了し、(1)と同じデータが取得されてしまいます。 ◆その他、確認したこと ・(1)の処理直後に処理を停止し、Enterprise Managerでロックが取得されているか確認したところ、トランザクションAがすべてのレコードを排他ロック(X)していた。 ・(2)の処理直後にロックの状態を確認しても、やはりトランザクションAが、排他ロック(X)していた。 ・CSEを使いODBC経由で同様の操作を行った場合も同じ動作がおこる。 ・(1)WITH(XLOCK, TABLOCK)とすると(2)でデータが取得できなくなる。 ・(2)のSQLを「SELECT * FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定するとタイムアウトする(期待通りの動き) ・(2)のSQLを「SELECT COLUMN01 FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定すると、今度は、なぜか取得出来てしまう。 ・(1)と(2)の間にトランザクションAでUPDATEなどを行うと(COMMITはしない)(2)のSQLのWHERE句や取得するカラムに関係なく、(2)のSQLはタイムアウトする(当り前か。。。) いろいろ書きましたが、排他ロックされたレコードに 共有ロックはかけれないという認識なのですが、 そうではないのでしょうか? また、そうではない場合どういった場合に、 共有ロックが可能となるのでしょうか? SQL Serverの排他制御に詳しい方や 同じような現象に陥った方がいましたら、ご教授お願いします。

  • ロックについて

    データベース初心者ですが、よろしくお願いします。 トランザクション処理のロック制御について質問です。 例えば、ユーザAが表に対しupdateを行い、commitを行わなかったとします。このときに、他のユーザBがその表に対しupdateを行った場合、エラーになるのでしょうか? 私は、トランザクション処理というのは、表操作を行ってからcommitするまでの間をひとくくりとして、その間はロックがかかると認識しています。 どなたかご教授願います。

  • PostgreSQLのブロックサイズ変更

    Windows版のPostgreSQLを使用していますが、ブロックサイズをデフォルトの8Kから 変更をおこないたいと考えています。 UNIX版であればconfigureコマンドにて設定を行うようですが、 Windows版はどのように設定すれば良いのでしょうか? ちなみにバージョンは9.0.5でWindows7の環境です。

  • oracleからposgreへの移行時の「LOCK

    Webアプリをoracleからpostgresqlに移行しています。 行き詰ってしまったので、どなたかアドバイスをお願いします! セッション1で  LOCK TABLE abc IN EXCLUSIVE MODE としている状態で、セッション2で select処理をして内容表示する処理があるのですが posgreでは、トランザクションを終了しないと、セッション2は止まったままになってしまいます。 セッション1のトランザクションを終了すると、セッション2で正常に表示できるのですが。。。 oracleでは、selectがLOCK前の状態で結果を返してくれるので セッション2も正常に表示できています。 いろいろ調べて、selectはOKのようなMODEも試したのですが、 解決できませんでした。 該当テーブルはROW単位ではなく、全体でLOCKしないとダメなのです。 ※試した方法は、 psqlで該当テーブルを、IN EXCLUSIVE MODEでLOCKし、Webアプリで select表示する処理を行いました。 よろしくお願いします。

  • mac PostgreSQLのアンインストール方法

    皆様 いつもお世話になります。 早速ですがご質問させて頂きます。 Postgresqlを使ったシステム開発の勉強するため、最新版をインストールしようと思っています。 (利用しているPCは中古で購入したものなので)あらかじめ入っていたPostgresqlを アンインストールしようと思ったのですが、方法が分からず困っています。 PCにPostgresqlがあらかじめ入っているかどうかは以下のコマンドで確認しました。 #psql --version psql (PostgreSQL) 9.1.9 contains support for command-line editing とりいそぎGoogleで検索してみたところ、 /Library/PostgreSQL/(Postgresqlのバージョン)/uninstall-postgresql.app にてアンインストールできるらしいのですが、/Libraryディレクトリ以下にPostgreSQLディレクトリがありませんでした。 作業が進まずほとほと困っています。 どなたかお詳しい方ご教授のほど何卒宜しくお願い致します! 環境: MacOSX 10.8.5 Postgresql9.1.9