relation.lock('LOCK IN SHARE MODE')
.lock
メソッドは、引数に文字列を渡すと、それをロック句として扱ってくれる。
参考: https://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html
tags: ActiveRecord
ActiveRecord の autosave
ActiveRecord の relation 定義には、 autosave
を指定できるが、その挙動のまとめ。
load_async
.load_async
で起動。
グローバルなスレッドプールのコネクションを利用して、別途で ActiveRecord をロードする仕組み。
ActiveRecord のデフォルト値
ActiveRecord は、 DB のデフォルトを読み込んで、それをモデルのデフォルト値として採用する。
aws-record
AWS が提供する ruby 系の gem で、DynamoDBをバックエンドとする ORM を提供する。 DynamoDB は RDB ではないので、ActiveRecord としては提供されず、独自 ORM という形式が取られている。
Rails でカラム削除
`ignore_columns` を指定してリリースし、その状態でカラム削除して、 ignore_columns を消して再度リリースする。
Active Record Extended
dependent: :destroy の実装は before_destroy
中の方で、 before_destroy によるフックで dependent: :destroy
は実現されている。
has_many :rel_name, scope
rails は、 relation と relation のジョイン、と認識している様子。
具体的には、 scope 条件は、 JOIN ... ON
の ON
の中の条件に追加される。
MySQL での外部キー制約とロック
MySQL で外部キー制約を持つレコードを Create, Update (Dも?) すると、その参照先レコードに共有ロックがかかる。
MySQL のレコードロックはその走査順
排他制御のための SELECT ... FOR UPDATE
は、その走査順に排他ロックを取るため、その順番が共通でないと、デッドロックを発生させがち。
paranoia
#delete
メソッドと #destroy
メソッドをオーバーライドするライブラリ。
default_scope
で paranoia_scope
まで導入してくれたりする。