私は、リアルタイムでユーザーを一致させるために構築しようとしているシステムを持っています。特定の基準に基づいて、ユーザーは1対1で照合されます。次のデータベーステーブルがあります(チャットルーレットタイプのシステムのようなものです)。
Pool
+UserId
+Gender
+City
+Solo (bool)
Matched
+UserId
+PartnerId
ユーザーが特定のページに入ると、trueに設定されてPool
テーブルに追加Solo
されます。次に、システムはテーブルにクエリを実行して別のユーザーを検索し、true(パートナーがいないことを意味します)であり、クエリしたものと等しいPool
結果を返します。一致が返された場合は、両方のユーザーをデータベースに入れ、テーブルの両方の列をに変更します。接続が切断されると、テーブルから削除され、列がに変わります。スレッドセーフで同時実行性でこれが機能する方法を設計しようとすると、問題が発生します。これが私が立ち往生したいくつかの質問です:Solo
Gender
City
Matched
Solo
Pool
false
Matched
Solo
true
-2人のユーザーPool
が同時にデータベースにクエリを実行し、両方が同じ「ソロ」ユーザーを返す場合はどうなりますか?これを防ぐにはどうすればよいですか?
-1人のユーザーPool
がユーザーのsolo
列が変更される前にクエリを実行した場合、そのユーザーは結果セットに返されますが、技術的にはソロではありません。
-他にどのような並行性/スレッドセーフの問題に直面していますか?これより良い方法はありますか?