Java/JDBC と MySQL を使用してアクティブ レコード パターンを実装し、並行処理のための楽観的ロックを実装しようとしています。
これで、テーブル内のすべてのレコードに「version_number」フィールドがあり、更新のたびにインクリメントされます。
これを実装するには2つの戦略があるようです:
- アプリケーションは、データを要求すると、各オブジェクト (レコードなど) の対応するバージョン番号も格納します。更新時に、バージョン番号がデータ層に「送信」され、UPDATE...SET...WHERE クエリで楽観的ロックに使用されます。
- アプリケーションはバージョン番号を保存しませんが、(データ行全体ではなく) オブジェクトの一部のみを保存します。楽観的ロックを成功させるには、データ層 (アクティブなレコード) が最初に DB から「行」をフェッチし、バージョン番号を取得してから、同じ UPDATE...SET...WHERE クエリを起動してレコードを更新する必要があります。
前者では、「最初のフェッチ」とその後の更新があります。後者の場合、「最初のフェッチ」だけでなく、更新の直前にもフェッチがあります。
問題はこれです:設計上、どちらがより良いアプローチですか? バージョン番号を含むすべてのデータを Web アプリケーションのフロントエンド (Javascript/HTML) に保存することは大丈夫ですか? 安全ですか? それとも、更新前に読み取りのパフォーマンス ヒットを取得するほうがよいでしょうか?
この設計を実装する「正しい方法」はありますか? アクティブ レコードの現在の実装 (Ruby、Play、ActiveJDBC など) がこれをどのように処理しているかはわかりません。JDBC で「そのまま」実装する場合、この場合の正しい設計上の決定は何ですか?