Open3
rails lock
排他制御とは複数人の同時アクセスすることによスデータの不整合が発生しないように制御を行うことを意味します。
排他制御には主に2種類があります。
楽観ロック
更新対象のデータが取得された時点から更新がないことを確認し、その後対象データを更新することでデータの整合性を保証します。
=>
「多分ダブルブッキングしないし、仮にダブルブッキングしてもそこまでヤバいことにはならないから、もしダブルブッキングしたら諦めるわ」と楽観的に考えて設計されているロックのこと
Item
Tシャツ, S, 12, 2024/11/1, 4
一枚売れたっす、lock_versionに1足しておこう
Tシャツ, S, 11, 2024/11/1, 5
元のデータみよう
A Tシャツ, S, 12, 2024/11/1, 4
よし、4だから更新しよう
B Tシャツ, S, 12, 2024/11/3, 6
あれ、誰か更新したのか、自分の更新は破棄しよう
=>
同時に1つのレコードに対して2つの更新リクエストが来ると、2つ目のリクエストがエラーになる
例えば、Gitのコンフリクトが似ている
悲観ロック
更新対象のデータが取得された時点から明示的にロックを行うい、その後更新対象のデータを更新することででデータの整合性を保証します。
明示的にロックを行うことにより、他のトランザクション処理による対象更新データを防ぎます。
=>
「ダブルブッキングしたらマズいでしょ。ダブルブッキングしないように、しっかりとロックするわよ」
テーブルの行を更新できないように作業前にロックする
デッドロック
お互いが相手の作業が終わるのを待っていて、どっちも身動きが取れなくなっている状況のこと
rspecのthreadでdeliver_laterすると止まる