• 締切済み

行ロックについて

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 です。

みんなの回答

回答No.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 だいたい知らない人が「行ロック」なんて単語でてくろだろうか?

pluto22
質問者

補足

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