• ベストアンサー

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