module AdvisoryLock::Implementation

Public Instance Methods

exclusive(lock_identifier, connection = ActiveRecord::Base.connection) { || ... } click to toggle source
# File lib/tracker/advisory_lock.rb, line 15
def exclusive(lock_identifier, connection = ActiveRecord::Base.connection, &_block)
  if obtained_lock?(lock_identifier, connection)
    begin
      yield
    ensure
      release_lock(lock_identifier, connection)
    end
  else
    raise "Cannot get lock #{lock_identifier.inspect}"
  end
end

Private Instance Methods

obtained_lock?(lock_identifier, connection) click to toggle source
# File lib/tracker/advisory_lock.rb, line 29
def obtained_lock?(lock_identifier, connection)
  connection.select_value("select pg_try_advisory_lock(#{lock_identifier})")
end
release_lock(lock_identifier, connection) click to toggle source
# File lib/tracker/advisory_lock.rb, line 33
def release_lock(lock_identifier, connection)
  connection.execute "select pg_advisory_unlock(#{lock_identifier})"
end