2017-02-13 4 views
0

TL; DR私は、ロックが解放されるまで、後続のクエリのためにロックされた行を非表示にしたいと思います。行への同時アクセス:ロックされた行を非表示にする

私は、データへの同時アクセスに依存するアプリケーションに取り組んでいます。

私は処理する必要のあるデータと、同じデータセットで実行する必要のある何千ものSQLクエリを持っています。アプリケーションレベルでは、すべてのSQLクエリを単一の大きなキューにシリアル化し、トランザクションごとに1つずつ実行します。

私はアプリケーションレベルで作成したこの擬似的な「キュー」ボトルネックを除去したいと考えていますが、DBの組み込み同時実行プリミティブ&のカーソルベースのデータアクセスに完全に依存しています。

このため、2つの同時SQLクエリが同じセット行をフェッチしないようにする必要があります。前のクエリは行をロックし、後のクエリはロックされた行を無視します。

私は次の絵がうまくいきたいと思っています(例は意図によって単純化されています; SELECTはカーソルベースのアクセスを使用してトランザクション内で実行することを検討してください)。

SELECT * FROM my_table ORDER BY id LIMIT 5; -- returns rows with IDs 1, 2, 3, 4, 5 
SELECT * FROM my_table ORDER BY id LIMIT 5; -- returns rows with IDs 6, 7, 8, 9, 10 

私の質問はでもこれは可能ですか?また、私はDBからあまりにも多くを求めていますか?

答えて

2

のPostgreSQL 9.5以降では、トランザクション内でこれを行うことができます:

SELECT * FROM my_table 
ORDER BY id 
LIMIT 5 
FOR UPDATE SKIP LOCKED; 
+0

あなたは私のヒーローです。 – gmile

関連する問題