0

私はプロジェクトに取り組んでおり、一種の「設計上の問題」に直面しています。「競争」を表すエンティティがあります。ユーザーには投票が与えられ、コンテストに投票します。各コンテストには 10 項目があり、それぞれに合計 10 票しか投票できません。ユーザーが自分の投票を使用しようとすると、まだ投票していないオープン コンテストをすばやく検索します。

問題は、複数のユーザーがすべて同じ競争を争っていることを考えると発生します。2 人のユーザーが同時に投票しているかどうかは気にしませんが、コンテストが最近終了したというエラーを防ぎたいのですが、終了する前に選択したためにまだ投票しているユーザーがいます...投票が終了すると、「競合状態」になります。

私の見方では、いくつかのオプションしかありません。

オプション 1: READ_COMMITTED トランザクションを有効にしますが、私の理解では、これは読み取り時に行をロックするため、ロックが返されるまで他のクエリは終了しません。これはJSPアプリなので、JSPのレンダリングが終了したら読み取りロックは終了しますか? 私はまだ同じ問題を抱えている可能性があるようです。

オプション 2: 競合をチェックアウトしたユーザーの数を書き出します。ただし、これは Database-as-IPC アンチパターンに従っているようであり、カウントの監視と維持が最も難しい場所であることがわかりました。

オプション 3: 心配しないでください。ユーザーの投票に時間がかかりすぎる場合は、エラーをスローして次の投票に移らせます。

オプション 4: AJAX を多用し、おそらく Atmosphere を使用したメッセージングを使用して、コンテスト ページでライブ投票数を維持します。ブラウザーのタイムアウトの処理方法や、ユーザーが単に途中で終了したときの処理方法がわからない...おそらく何らかのクリーンアップ タイマーですか?

ユーザーの観点からすると、実装のしやすさと使いやすさのバランスが取れているように見えるため、現在はオプション 4 に頼っていますが、ここで見落としがないことを確認したいと思います。

他の人は同様の状況にどのように対処しましたか?

4

1 に答える 1

1

楽観的ロックまたは悲観的ロックの使用を検討してください。これは、並行性の問題を解決する通常の方法です。

于 2012-08-30T13:32:30.307 に答える