こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

行ロックについて

Web上のボタンをクリックしたとき

該当データを1件取得しそのデータにフラグをたてる
⇒フラグを管理するテーブルに投入する
という処理をしており該当データは一人につき1件取得したいです。


BEGIN
SELECT * FROM TABLE1 WHERE day = 今日 ORDER BY time LIMIT 1 FOR UPDATE

UPDATE TABLE1 SET flag = 1 WHERE id = $id

INSERT INTO TABLE2 (time , flag ) VALUES ($time , 1);
COMMIT


現在の問題は同時にボタンを押したとき
SELECTで取得したデータが重複してしまうことがあることです。

BEGINからCOMMITまでを一連の流れとし、
その間はSELECTもできないようにしたいです。

ドキュメントに
FOR UPDATEだとUPDATE、DELETE、SELECT FOR UPDATEは拒否されます
とありますのでSELECTは通ると解釈するとFOR UPDATEでは実現できないのでしょうか?

テーブルのロックではなく行のロックで実現したいのですが
どなたかご教授お願い致します。

※バージョンはPostgreSQL 8.1.18 です。

投稿日時 - 2012-12-29 18:22:25

QNo.7867009

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

つりっぽいですね。

ネットで検索すると、すぐでてくる。なんでしょうね

http://search.yahoo.co.jp/search?p=%22PostgreSQL%22+%22%E8%A1%8C%E3%83%AD%E3%83%83%E3%82%AF%22&aq=-1&oq=&ei=UTF-8&fr=ie8sc&n=10&x=wrt

http://www.fireproject.jp/feature/postgresql/sql-intro/transaction-lock.html

だいたい知らない人が「行ロック」なんて単語でてくろだろうか?

投稿日時 - 2012-12-29 19:44:36

補足

言葉が足りなかったようで申し訳ありません。
現在ロックについて勉強中です。検索など調べた上でやってみたのですが、思うように動作しないため質問しております。
つりと言われびっくりしています。

投稿日時 - 2012-12-30 09:11:52