deruse
deruse

Reputation: 2881

What kind of exception is raised by ActiveRecord::lock!?

I am using lock! in my code and want to catch the exception thrown if lock! fails for some reason (e.g. cannot get the lock). What kind of exceptions can lock! throw? I checked the ruby docs but couldn't find the specific Exception classes.

Thanks.

Upvotes: 3

Views: 1722

Answers (2)

wxgeorge
wxgeorge

Reputation: 473

When in doubt, probe.

Consider the following pair of functions:

def long_hold
  ActiveRecord::Base.transaction do
    u = User.find(220)
    u.lock!
    sleep 100.seconds
    u.email="[email protected]"
    u.save!
  end
end

def short_hold
  ActiveRecord::Base.transaction do
    u = User.find(220)
    u.lock!
    u.email="[email protected]"
    u.save!
  end
end

In my setup (OSX 10.11, ruby 2.2.4, rails 4.2, postgres 9.5), running long_hold in one rails console and then running short_hold in a second console, I observe short_hold blocks until long_hold completes; moreover, instrumenting the code with puts, we see that while long_hold is sleeping, short_hold is waiting to acquire the lock.

Assuming no caveats about the independence of rails consoles, this suggests that no exceptions are thrown if a second process tries to lock a row that is already locked, but that process blocks until the first completes.

Upvotes: 2

Devin M
Devin M

Reputation: 9752

Here is the source for that locking call. It calls reload and its source looks like this:

          # File lib/active_record/base.rb, line 2333
2333:       def reload(options = nil)
2334:         clear_aggregation_cache
2335:         clear_association_cache
2336:         @attributes.update(self.class.find(self.id, options).instance_variable_get('@attributes'))
2337:         @attributes_cache = {}
2338:         self
2339:       end

so when you call reload(:lock => lock) as the call to lock does it it really updating the attributes of that record.

There are a lot of different situations here. You could try to lock a record that dosnt exist, or lock one that has been locked elsewhere. What error are you interested in catching?

Upvotes: 1

Related Questions