web-dev-qa-db-ja.com

データベースレコードのロック

私が今持っているもの:

  1. レコードがたくさんあるテーブル。
  2. 各レコードのデータに基づいて、いくつかのルールに従って約200人のユーザーがレコードを選択できます。
  3. 2人以上のユーザーが同じレコードを選択する可能性が高くなります。
  4. ユーザーがレコードを更新してから、データベースに保存し直します。そのレコードは再度選択されません(ソフト削除)。
  5. 楽観的ロックが試行されましたが、パフォーマンスはPOに受け入れられませんでした。
  6. 私たちの解決策は、ユーザーがレコードを選択すると、レコードの「ロック」フィールドを更新することでした。

問題点:

  1. ユーザーが同じレコードを選択しているため、衝突は引き続き発生しています。 2人のユーザーが同じレコードを選択できないようにする必要があります。
  2. ユーザーが長時間何もしない場合は、手動でロックを解除する必要があります。

検索したところ、Amazon SQSは良い解決策だったようですが、キューを検索できないという問題がありました。

私の問題を解決するための良い技術はありますか?選択するとメッセージがロックされ、一定時間後にロックが期限切れになる検索可能なキューを実装する必要があります。

1
Songo

レコードがロックされたとき、またはロックが解除されるときのタイムスタンプをレコードに追加することで、ユーザーがレコードをアトミ​​ックに選択して「ソフトに」ロックできるようにすることができます。ロック時の時間とlockフィールドに基づいてレコードを除外することにより、ロックされたレコードにアクセスできないようにします。

タイムスタンプをエポックに戻すように設定することで、手動ロック解除(ロールバック/キャンセル用)を実装できます。

1
ratchet freak