Rails:悲観的ロック


写真撮影:Benjamin Bortels

問題
どのようなときに1ユーザーが正確に同じ瞬間に我々のデータベースのテーブルを更新しようとするとどうなりますか?あなたはそれを推測!レース条件-プログラマとして、あなたはそれらを憎む必要があります、おそらくこれを読んだ後、我々はそれらを引き起こす少なくとも1つのことを避けることができます.

定義

悲観的なデータベースロック
他の人がを読んでいる間、複数のユーザーは読むことができません

データベースロック
  • 複数のユーザーは同時に同じリソースを読むことができます、しかし、より多くのものがデータベースを修正しようとするならば、我々はそれを
  • 楽観的なロックでは、データを更新するときにのみロックします.他の要求はまだ対象のデータを読むことができます.一方、悲観的なロックは、レコードへの他のすべてのアクセスをロックします.読み出しアクセスさえ許可されません.このタイプのロックで、オブジェクトへの最初の要求が更新されている間、他のすべての要求は彼らのターンを待たなければなりません.
    この記事では、楽観的なロックのために、これをチェックアウトするために、簡単です.
    Optimistic Locking

    イマジン
    閉じるこの動画はお気に入りから削除されています
      def like(id)
        message = Message.find(id)
        message.like_count += 1
        message.save!
      end
    
    つのユーザーが同じようなボタンを押すと、別のユーザーが同じボタンを同時に押すと、そのメッセージのlike_countの代わりに2になると、それは1つだけインクリメントされます.
    with_lockOfficial Docs
    ロックが何をするかは、いくつかのことです.まず、データベーストランザクションを開始します.第二に、それは悲観的なデータベースロックを取得します.ロックが取得されると、レコードがメモリに再ロードされ、レコードの値がロックされているデータベース行の値と一致します.ロックは他の人がその行を読み書きするのを防ぎます、そして、ロックを獲得しようとする他の誰でも、ロックがリリースされるのを待たなければなりません.
      def like(id)
        message = Message.find(id)
        message.with_lock do
          message.like_count += 1
          message.save!
        end
      end
    
    今このロックトランザクションが行われている間、このユーザーアカウントをロックしたいと考えています.その結果、このトランザクションのスコープでユーザーモデルに更新を行うことはできません.
    私たちにできることはaccount.lock!を呼び出すことです
      def like(id)
        message = Message.find(id)
        message.with_lock do
          account.lock!
          message.like_count += 1
          message.save!
        end
      end
    
    我々はすでにデータベーストランザクション(最初のロック)にあるので、それ自体がトランザクションであるので、私たちは別のwith_lockブロックを使用することができません.このwith_lockブロックの内部でできることは、.lock!を呼び出します.
    これは2つの例外を持つwithlock lockメソッドと非常によく似ています.最初に、それはちょうど呼び出しの時にロックを取得し、内部トランザクションを内部で管理するのではなく、周囲のトランザクションが完了するたびに、それを解放します.第二に、トランザクションの内部で呼び出されない場合は絶対に何もしません.繰り返し、ロックを使用しないでください!取引外!しかしながら、それ以外にも、WithLockロックメソッドが同じデータの完全性を保証します.
    読書ありがとう!ハッピーロック!
    ソース:(ありがとう!)
    https://www.peterdebelak.com/blog/pessimistic-locking-in-rails-by-example/
    http://blog.katpadi.ph/race-condition-and-rails-with_lock/