• ベストアンサー

postgreSQLで更新後のデータを取得したい。

postgreSQLで更新後のデータを取得したい。 初めて質問させていただきます。 postgreSQLでupdateした後、更新後のデータをselectで取得したいのですが、 トランザクションが完了するまでにselect文が発行されているみたいで、更新前のデータを取得してしまいます。 それぞれ、違うファイルから投げられているので、同じトランザクションにすることはできません。 何かいい方法があればご教授お願いします。 a.phpで下記のSQLを発行 update test_tbl set test1 = 'aaa' where test2 = 'bbb' a.phpが走っている間に、下記のb.phpが実行される。 select test1 from test_tbl 環境 php5 postgres8.1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

2個提案します。 1.Aでupdateする前にcvs形式でファイル保存して、Bではselectせずにcvsを見に行く。 ただ、1レコードならいいですけど、膨大なレコードの場合 考え物だと思います。 2.Bでselectする時にFOR UPDATEをつければAが更新中だったら 更新が終わるのを待ってからselect出来ると思います。 ただ、Aが数秒おきに行われるということなので、 Bのselectが終わったらすぐにロックを解除しないとAが数秒間 止まる可能性を考えなければなりません。

yamabaka_y
質問者

お礼

回答ありがとうございます。 2の方は既に試したのですが、できませんでした。 1の方でやってみたいと思います。 ありがとうございました。

その他の回答 (2)

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.3

定期的なUPDATEの自動処理はあまりお勧めできませんね・・。 何か別の方法で代用することは不可能なのでしょうか? トランザクションがかかっているテーブルを引っ張る(別トランザクションをかける)こと自体、トランザクションの概念に反しています。 ちなみにトランザクションはどのレベルでしょう。 http://www.postgresql.jp/document/pg800doc/html/transaction-iso.html こちらを参考に補足いただければと思います。

yamabaka_y
質問者

補足

トランザクションのレベルはシリアライザブルです。 別の方法、下記の方法で試してみたいと思います。 回答ありがとうございました。

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.1

phpの内部処理がわからないので答えようがないです。 トランザクション云々以前に、一回のDB接続処理内で二つのSQLを発行してしまっているのではありませんか? 【ファンクションA】 DB接続→(トランザクション開始→)UPDATE SQL発行→(正常終了だったらコミット、エラーが出たらロールバック)→DB接続終了 【ファンクションB】 DB接続→(トランザクション開始→)SELECT SQL発行→(正常終了だったらコミット、エラーが出たらロールバック)→DB接続終了 のようなファンクションを作り、 PHPの画面処理側で 「ファンクションA(UPDATE)呼び出し→戻り値がTrueだったらファンクションB呼び出し(SELECT)」 のような制御をいれればいいのでは?

yamabaka_y
質問者

補足

早速の回答ありがとうございます。 PHPの内部の処理はおっしゃられた通りになっております。 ただ、ファンクションAの方が数秒おきに自動的に発行され、ファンクションBがボタンを入力したときに発行されるので、Trueの判定ができません。

関連するQ&A

  • Linux上のpostgreSQLデータをWindowsでみたい

    サーバA(OS:Linux Fedora Core 4、データベース:PostgreSQL 8.0 で運用しているシステムがあり、毎日そのデータを下記のdumpコマンドで PostgreSQLの全データをバックアップしています pg_dumpall > postgres.out  サーバAを触るのは怖いので、別のマシンB(Windows-Xp)に postgresql-8.2.6をインストールしました。 このバージョンは、postgresqlとともに、pgAdmin3というGUIの管理 ツールもついていると聞きここに、サーバAからバックアップされている postgres.outをrestoreして pgAdmin3でデータベース・テーブル等をみようとしています (postgres.out)を使ってのリストアの仕方は (1)(postgres.out)をpostgresqlの/binディレクトリの中に入れる (2)psqlのメニューから次のコマンドを打つ psql -d manmg -f postgres.out   (3)pgAdmin3を立ち上げるとサーバAのDBは追加されているようなのですが  テーブルは(0)となって見えません マシンBの方のPostgreSQLについてはインストールしたままでサーバA のpostgresqlの設定等は何もしていません 何か設定する所はあるのでしょうか 上記手順でlinuxから吐出されたバックアップデータをWindowマシンに リストアする方法は間違っていないのでしょうか よろしくお願いします。

  • PostgreSQLを初期化できない

    RedHat8.0にPostgreSQL7.2.3をインストールしましたが、下記コマンドで初期化できません。 $ initdb -bash: initdb: command not found なお、PostgreSQL7.2.1をインストールしていましたが、その際は初期化できていました。ただし、テキストエディタでpostgresql.conf、pg_hba.confを編集するため、開こうとしましたが、開けませんでした(ファイルが表示されない)。ファイルを検索すると、/usr/local/pgsql/data/にあることになっていましたが…。アクセス権限の問題と考え、postgresでログインしようとしましたが、パスワードの初期設定が分かりませんでした。今回、Windows上で作成したPHPプログラムの動作を検証するため、テスト環境を構築しようとしています。インストールしたApache1.3.27、PHP4.2.2に合わせて、バージョンを更新しました。アンインストールし、インストール前に $ make check で All 79 tests passed. であることも確認しています。

  • Oracle→Postgresql 移行について

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

  • VB ログファイルからデータを時間毎に取得したい

    VBでログファイルからデータを1行ずつ読み取り、 1時間毎と1秒毎の件数を取得したいです。 ログファイルは下記のように数千行のデータが存在します。 1 | 20140306 07:12:34 , TEST_A , AAA , 001 2 | 20140306 07:12:34 , TEST_A , BBB , 001 3 | 20140306 07:15:01 , TEST_A , BBB , 001 4 | 20140306 08:12:34 , TEST_B , CCC , 002 5 | 20140306 08:20:30 , TEST_A , CCC , 002 6 | 20140306 08:20:30 , TEST_A , CCC , 002 7 | 20140306 08:20:30 , TEST_A , CCC , 002 8 | 20140306 09:12:33 , TEST_A , AAA , 003 9 | 20140306 10:15:47 , TEST_A , BBB , 004 10 | 20140306 10:15:47 , TEST_B , BBB , 004 ・ ・ ・ 条件は、データに「TEST_A」と言う文字列が含まれている事です。 この場合、まず1時間毎の件数を取得して 指定のセルに表示させます。 7:00 | 3 8:00 | 3 9:00 | 1 10:00| 1 そして、その時間毎の秒間最大件数を取得して 指定のセルの表示させたいです。 7:00 | 2 8:00 | 3 9:00 | 1 10:00| 1 何卒、よろしくお願いいたします。

  • データの取得に関して

    データを取得する際、表示開始日の午前10時になったらデータを取得するような形にしたのですが、 下記のようにすると、その日になると同時に取得してしまいます。(10時より前に) 例えば、表示開始日が11月1日だった場合、 11月1日の10時になったら表示するようにしたいのですが、どういう感じにすればいいでしょうか。 <?php $time=date("H"); if($time>9) { select * from test where start<=getdate() } else { select * from test where start<getdate() }

    • 締切済み
    • PHP
  • UPDATE文でこのような更新はできますか?

    (TBL_A) A1  A2 ----------- 1  100 2  200 3  300 4  400 5  500 (TBL_B) B1  B2 ----------- 1  100 3  300 4  400 上記のようなテーブルAとBがあったとして 次のようなUPDATE文を実行することはできますか? できない場合、SQL1発で更新する他の方法はありますでしょうか? UPDATE TBL_A A SET A.A1 = A.A1 + B.B1 A.A2 = A.A2 + B.B2 WHERE EXISTS (SELECT 'X' FROM TBL_B B WHERE A.A1=B.B1) 【更新後のTBL_A表】 A1  A2 ----------- 1  200 <= (*)更新される 2  200 3  600 <= (*)更新される 4  400 5  1000 <= (*)更新される 【やりたいこと】 TBL_A表のA2列のデータにTBL_B表のB2列のデータを加算したい。 その場合の更新条件として「A1がB1に存在している場合のみ」という条件を加えたいのです。 すいませんが、よろしくおねがいします。

  • PHPとPostgreSQLとの連携

    今、WindowsXPでPHPとPostgreSQLを連携 させたいのですがなかなか上手く行きません。 どなたか、分かる方がいれば宜しくお願いします。 環境 OS→Windows HomeEdition Apache→Apache HTTP Serber2.0.59 PHP→PHP4.4.4 PostgreSQL→PostgreSQL8.1.4 です。 PostgreSQLの中にtest_dbというデータベースをつくり setuzoku.phpから接続できるかどうかのif文を作り確認 していますが、何度やっても接続失敗と出ます。 <?php $con = pg_connect("user='postgres' dbname='test_db' password='grjtf'"); if (! $con) { print "接続失敗"; } else { print "接続成功"; } ?>

  • postgreSQLで分からないことがあります。

    postgreSQLで分からないことがあります。 よろしくお願いします。 下にあるtblというテーブルがあったとき。 下のSQLを実行するとデータがうまく取れているんですが、 CURRENT_DATEは日付型でSUBSTRでとりだした日付は文字列 なのに何故正しく比較できているのでしょうか? 日付型の形式の文字列であれば、RDBMSがかってに日付型にしてくれるのでしょうか? tblテーブル *sdateとedateはtimestamp型です。 sdate      | edate | ----------------------------------------- 2010-5-1 10:00:00 | 2010-5-2 13:00:00| SELECT * FROM tbl WHERE CURRENT_DATE BETWEEN SUBSTR(sdate, 1, 10) AND SUBSTR(edate, 1, 10)

  • PostgreSQL 7.2.8 異なるデータベース間のテーブル

    こんにちは。かなり困っています、よろしくお願いします>< PostgreSQL 7.2.8 を使用しています。 一つのユーザーで、二つのデータベースがあります。 それぞれ同じカラムを持つ同じ名前のテーブルがあります。 中のデータは違います。 db1 - tableT db2 - tableT 条件を付けて、db1のtableTのデータを db2のtableTへコピーするにはどのような方法がありますか? 例えば select * from db1.tableT tbl1, db2.tableT tbl2 where tbl1.title = tbl2.title; のようにしてとりあえずselectで試してみましたがダメでした。 やはりスキーマとデータベースは違うんですね>< ドットが認識されませんでした。 どなたか解決法をご存知の方、よろしくお願いします。

  • PHPとPostgreSQLにおいて

    こんばんわー。質問させて下さい。 PostgreSqlでテーブルを作成しました。 ---------------------------- [test_db] id:integer name:varchar(128), number integer ---------------------------- 上記のテーブルの構成をPHPプログラム内で取得 したいのですが、ご存知の型いらっしゃいますか? ちなみにPHP4です。 とりあえず浮かんだ考えは、 一度レコードをSELECTしてそれぞれのフィールドの型と大きさを取得する方法なんですが、レコードが存在していないとできないと思います。 すみませんが、宜しくお願い致します。

    • ベストアンサー
    • PHP