2017-01-08 3 views
0

私は、ユーザーがランダムにマッチングされるチャットルーレットに似たアプリを持っています。私はデータベースレベルで、2人のユーザを一致させることによってこれをやっていますuser.looking == truePostgres:明示的なロックでの読み取りを防ぐには?

しかし、これは、ユーザ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の方法が必要です。

+0

ちょうどそれを更新 - それが自動的にロックされます。 –

答えて

0
  1. ABCが同時にクエリを実行し、あなただけの1だけのレコードを更新、真== user.lookingのようなレコードを取得することができますしたい場合、PGは実際にここに三つのステップ

      を行います
    • が始まります。
    • 更新レコード
    • コミット;アップデートを行うと仮定すると、

は、Bが同時にレコードを更新したい、Bは、更新レコードの段階でブロックします。 MVCCがBからの更新をブロックするという事実でレコードをロックするように見える。更新はテーブルをROW EXCLUSIVEロックで更新し、ROW EXCLUSIVEはROW EXCLUSIVEロックをブロックしない。

すると同時にB更新:

example here1

example here2

関連する問題