分散システム内でのレコードロックに関する推奨事項を探しています
-
03-07-2019 - |
質問
ロックの記録に関しては、チームに推奨される設計パターンを考えています。典型的な考え方は次のようなものです。 1.ユーザーがリストからレコードを選択します 2.ユーザーIDでレコードをロックします 3.ロックされたレコードレコードをロードします(ロックなし、誰かがそれを破りました)。
何かが足りないのですか、これがこれを行う唯一の方法のように見えますか? ((私たちの場合、オプティミスティックロックは、エンドユーザーにとって面倒で混乱を招くでしょう。多くの場合、編集はかなり充実しています。)
解決
ソリューションの管理を集中的にする可能性のある詳細は、クラッシュまたは接続障害の後にロックを取り除くことです。そこで、楽観的ロックと悲観的ロックのトレードオフが実際にあります。楽観的ロックが失敗したときに編集を手動でマージまたはやり直しするのは苦痛ですが、悲観的で永続的なロックモデルでクラッシュした後のモップアップは頭痛の種です機会)
1つの答えは、トランザクションと並行性を管理するためにRDBMSのメカニズムを使用することです。SELECTFOR UPDATEまたは環境と分離レベルに合った構文でレコードを取得します。クライアントの1つがクラッシュしたり切断されたりすると、トランザクションはロールバックし、ロックが解除されます。
Webなどのコネクションレス環境や、接続が頻繁に失われ、回復する環境では、セッションタイムアウトを使用したセッションベースのモデルも機能します。
- セッションが期限切れの場合、レコードの既存のロックをクリアしようとします
- セッションIDにレコードをロックしようとしました(前のステップが失敗すると失敗します)
- ロックされたレコードを選択します(前のステップが失敗した場合、レコードは返されません)
したがって、セッションの有効期限が切れるとロックが解除されます。クラッシュ後のロックを手動で削除したり、クライアント/接続の問題をある程度許容したりする必要はありません。ただし、コーディングにはもう少し手間がかかります。