dポイントプレゼントキャンペーン実施中!

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

A 回答 (3件)

2個提案します。



1.Aでupdateする前にcvs形式でファイル保存して、Bではselectせずにcvsを見に行く。

ただ、1レコードならいいですけど、膨大なレコードの場合
考え物だと思います。

2.Bでselectする時にFOR UPDATEをつければAが更新中だったら
更新が終わるのを待ってからselect出来ると思います。

ただ、Aが数秒おきに行われるということなので、
Bのselectが終わったらすぐにロックを解除しないとAが数秒間
止まる可能性を考えなければなりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

2の方は既に試したのですが、できませんでした。

1の方でやってみたいと思います。

ありがとうございました。

お礼日時:2009/07/14 20:08

定期的なUPDATEの自動処理はあまりお勧めできませんね・・。


何か別の方法で代用することは不可能なのでしょうか?

トランザクションがかかっているテーブルを引っ張る(別トランザクションをかける)こと自体、トランザクションの概念に反しています。

ちなみにトランザクションはどのレベルでしょう。
http://www.postgresql.jp/document/pg800doc/html/ …
こちらを参考に補足いただければと思います。

この回答への補足

トランザクションのレベルはシリアライザブルです。

別の方法、下記の方法で試してみたいと思います。

回答ありがとうございました。

補足日時:2009/07/14 20:08
    • good
    • 0

phpの内部処理がわからないので答えようがないです。


トランザクション云々以前に、一回のDB接続処理内で二つのSQLを発行してしまっているのではありませんか?

【ファンクションA】
DB接続→(トランザクション開始→)UPDATE SQL発行→(正常終了だったらコミット、エラーが出たらロールバック)→DB接続終了
【ファンクションB】
DB接続→(トランザクション開始→)SELECT SQL発行→(正常終了だったらコミット、エラーが出たらロールバック)→DB接続終了

のようなファンクションを作り、

PHPの画面処理側で
「ファンクションA(UPDATE)呼び出し→戻り値がTrueだったらファンクションB呼び出し(SELECT)」
のような制御をいれればいいのでは?

この回答への補足

早速の回答ありがとうございます。

PHPの内部の処理はおっしゃられた通りになっております。

ただ、ファンクションAの方が数秒おきに自動的に発行され、ファンクションBがボタンを入力したときに発行されるので、Trueの判定ができません。

補足日時:2009/07/14 17:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す