私は、ユーザーがランダムにマッチングされるチャットルーレットに似たアプリを持っています。私はデータベースレベルで、2人のユーザを一致させることによってこれをやっていますuser.looking == true
Postgres:明示的なロックでの読み取りを防ぐには?
しかし、これは、ユーザAが待っていて、ユーザBとCが同時に動作している場合に脆弱です。
レコードをロックしてクエリを作成したときに読み込めないようにする方法はありますか?同様に、ユーザBは、(ユーザーAを返すことになる)最初SELECT * FROM users WHERE looking=true
問い合わせを行うなった場合、私は同じクエリは、ユーザーC.
ために何も返さないしたい私はこれを見ていた:https://www.postgresql.org/docs/9.1/static/explicit-locking.html が、行レベルロックは見ていません彼らは読書のために働くように?
は基本的に私は、同じレコードを見つけ、別のスレッドのリスクなしに記録テーブルレベルのロックに加えて、行レベルのロックがあります。 は排他ロックまたは共有ロックです。行が更新されるか が削除されると、 特定行の排他的な行レベルロックが自動的に取得されます。トランザクションがコミットまたはロールバックされるまで、ロックは保持されます。 はテーブルレベルのロックと同じです。行レベルのロックはデータに影響しません クエリします。彼らは同じ行にライターだけをブロックします。
2)それ
を更新を検索)
1の方法が必要です。
ちょうどそれを更新 - それが自動的にロックされます。 –