Rails:悲観的ロック
5267 ワード
写真撮影:Benjamin Bortels
問題
どのようなときに1ユーザーが正確に同じ瞬間に我々のデータベースのテーブルを更新しようとするとどうなりますか?あなたはそれを推測!レース条件-プログラマとして、あなたはそれらを憎む必要があります、おそらくこれを読んだ後、我々はそれらを引き起こす少なくとも1つのことを避けることができます.
定義
悲観的なデータベースロック
他の人がを読んでいる間、複数のユーザーは読むことができません
データベースロック複数のユーザーは同時に同じリソースを読むことができます、しかし、より多くのものがデータベースを修正しようとするならば、我々はそれを 楽観的なロックでは、データを更新するときにのみロックします.他の要求はまだ対象のデータを読むことができます.一方、悲観的なロックは、レコードへの他のすべてのアクセスをロックします.読み出しアクセスさえ許可されません.このタイプのロックで、オブジェクトへの最初の要求が更新されている間、他のすべての要求は彼らのターンを待たなければなりません.
この記事では、楽観的なロックのために、これをチェックアウトするために、簡単です.
Optimistic Locking
イマジン
閉じるこの動画はお気に入りから削除されています
ロックが何をするかは、いくつかのことです.まず、データベーストランザクションを開始します.第二に、それは悲観的なデータベースロックを取得します.ロックが取得されると、レコードがメモリに再ロードされ、レコードの値がロックされているデータベース行の値と一致します.ロックは他の人がその行を読み書きするのを防ぎます、そして、ロックを獲得しようとする他の誰でも、ロックがリリースされるのを待たなければなりません.
私たちにできることは
これは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/
問題
どのようなときに1ユーザーが正確に同じ瞬間に我々のデータベースのテーブルを更新しようとするとどうなりますか?あなたはそれを推測!レース条件-プログラマとして、あなたはそれらを憎む必要があります、おそらくこれを読んだ後、我々はそれらを引き起こす少なくとも1つのことを避けることができます.
定義
悲観的なデータベースロック
他の人がを読んでいる間、複数のユーザーは読むことができません
データベースロック
この記事では、楽観的なロックのために、これをチェックアウトするために、簡単です.
Optimistic Locking
イマジン
閉じるこの動画はお気に入りから削除されています
def like(id)
message = Message.find(id)
message.like_count += 1
message.save!
end
つのユーザーが同じようなボタンを押すと、別のユーザーが同じボタンを同時に押すと、そのメッセージのlike_count
の代わりに2になると、それは1つだけインクリメントされます.with_lock
Official 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/
Reference
この問題について(Rails:悲観的ロック), 我々は、より多くの情報をここで見つけました https://dev.to/nodefiend/rails-pessimistic-locking-45akテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol