You can use lock using with_lock
method on query collection:
Clear::SQL.transaction do# SELECT * FROM users WHERE organization = 'Crystal Lang' FOR UPDATEUser.where(organization: "Crystal Lang").with_lock.each do |user|# Do something with your usersendend
with_lock
offers optional parameters (default: "FOR UPDATE"
), to setup the lock options you want (ex: with_lock("FOR UPDATE SKIP LOCKED")
)
See PostgreSQL deep explanation about locking here.
Lock work only inside transaction. Without transaction block, the call might fail.