2016-10-10 2 views
0

私はPostgresDBを持っています。一つのテーブルに私はServer-IPを持っています。しかし、私は、2人の労働者が同じServer-IPを取​​得しないようにしたいので、1つのIPが選択されると直ちに他のすべての労働者にとって利用できないはずです。PostgresqlDB上で2人の作業者の結果が異なることを確認してください

CREATE TABLE server 
(
    id INT AUTO_INCREMENT, 
    ip VARCHAR(15) NOT NULL, 
    created INTEGER NOT NULL, 
    modified INTEGER NOT NULL 
) 

Sampledata 
1 | 192.168.5.22 | 1476086120 | 1476086120 
2 | 192.168.5.29 | 1476084147 | 1476084147 

Worker 1: SELECT ip FROM server LIMIT 1 -> 192.168.5.22 
Worker 2: SELECT ip FROM server LIMIT 1 -> 192.168.5.22 // but I'd rather have the result for id = 2 here, since id = 1 was already selected by Worker 1 

誰でもこれを達成する方法についての良い方向を指摘できますか?

挿入、更新、削除のみに適用されるため、通常のロックはできません。選択したものはすべて選択です。

多分選択と更新の方法が1つのステップでありますが、それに関連するものは何も見つかりませんでした。 ここではいくつかの助けに感謝します。

おかげ

+0

** [EDIT]あなたの質問をし、いくつかのサンプルデータと予想される(table'文を作成 'として)テーブル定義を追加します。

代わりに、1つのトランザクションでSELECT ... FOR UPDATEUPDATEを使用することができますそのデータに基づいて出力します。 [_Formatted_](http://stackoverflow.com/editing-help#code)**テキスト**お願い、[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-may-i -not-upload-images-of-code-on-so-ask-a-question/285557#285557) –

答えて

0

あなたは次の例のようにUPDATE ... RETURNINGを使用することができます。ここではid

UPDATE iptable 
SET processed = TRUE 
WHERE id IN (SELECT id FROM iptable 
      WHERE NOT processed 
      LIMIT 1) 
RETURNING ip_adress; 

は主キーです。
部分的なインデックスON iptable(id) WHERE NOT processedは、クエリを高速化する可能性があります。 **

START TRANSACTION; 

SELECT id 
FROM iptable 
WHERE NOT processed 
LIMIT 1 
FOR UPDATE; 

UPDATE iptable SET processed = TRUE WHERE id = ...; 

COMMIT; 
関連する問題