Session.SessionID を使用して複数のユーザーが同じデータを同時に表示しないようにする ASP.NET アプリケーションがあります。
処理が必要な一連の画像 (BLOB に格納) を含むテーブルがあります。同じ画像を同時に表示できるのは 1 人のユーザーのみです。これを実現するために、各レコードがユーザーによって取得されると、レコードは Session.SessionID で更新されます。この更新は、ReaderWriterLock 内で行われます。
ReaderWriterLock が正しく機能していることを確認するテストを行い、そのブロック内のコードを一度に実行できるセッションは 1 つだけであることを確認しました。
私の現在の理論では、2 人の異なるユーザーが同時に同じ SessionID を取得しているというものです。このアプリケーションのユーザーは、ロックしたレコードまたはロック解除された画像を表示できます。
すべてのページのフッターに SessionID を表示するようにアプリケーションを修正し、問題が再発した場合に SessionID の値を確認できるようにしました。
SessionID が一意ではないことを示唆する記事や、SessionID が一意であると述べている記事をオンラインで見たことがあります。SessionID が永久に一意ではないことは理解していますが、SessionID の値はアクティブなセッションに対して一意であると見なすことができますか?
また、Guid を Session オブジェクトに格納し、Session ID の代わりに一意の ID として使用する必要があるという提案も読みました。
これまでの回答に感謝します。これまでの回答に基づく説明は次のとおりです。
「永遠にロック」 - 5 分間のロック タイムアウトでこれを防ぎます。ユーザーが画像をロックする前に、ReaderWriterLock 内で、古いロックの「クリーンアップ」(5 分以上ロックされた画像のロックを解除します)、最も古いロック解除された画像を取得するためのクエリ、およびそれを「ロック」する更新ステートメントを実行します。現在のセッションへのイメージ。
この問題の考えられる原因は、1 人のユーザーがイメージを「ロック」した後、短い休憩のために PC から離れた場合です。彼らが 5 分間何もしなかった場合、画面上のその画像のロックが解除され、別のユーザーによって開かれる可能性があります。問題が報告されたときにこのシナリオについて言及し、ユーザーが継続的に作業していることを確信しました.
「別のウィンドウ/タブ」 - 私は実際にエラーを自分の目で見たことはありませんが、問題を報告した人は、2 つの異なる PC とログイン ユーザーの 2 つの異なるユーザー名であると私に言いました。
ページにセッション ID を表示していることを願っています。次にそれが発生したときに、それが 2 台のマシンで同じセッション ID なのか、それとも他の問題なのかを確実に判断できるようになることを願っています。この問題は、テスト段階では発生していないため、多数の同時ユーザーの症状であると思われます。
これまでの回答に感謝します。詳細がわかり次第、この質問を更新します。
ユーザーは私に全容を教えてくれなかったようです。セッションIDは、受け入れられた回答に従って、私たちの場合は一意です。ユーザー 1 が 5 分間の「放棄された画像」のロック解除プロセスでアイドル状態だったため、2 人のユーザーが同時に同じ画像を見ることができました。この問題を回避するために、「放棄されたイメージ」タイムアウトがセッション タイムアウトと一致するように引き上げられました。