diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2006-06-20 01:58:36 +0000 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2006-06-20 01:58:36 +0000 |
commit | 722e0b6a8bb62226437e466b5a98356d026b05f5 (patch) | |
tree | 63aebf36e9d2dcc63f35210b764b1af061178073 /activerecord/lib/active_record/locking.rb | |
parent | e4254939aa8abb7a18f65e95cafaa2f37cbfa754 (diff) | |
download | rails-722e0b6a8bb62226437e466b5a98356d026b05f5.tar.gz rails-722e0b6a8bb62226437e466b5a98356d026b05f5.tar.bz2 rails-722e0b6a8bb62226437e466b5a98356d026b05f5.zip |
r4664@asus: jeremy | 2006-06-19 18:55:36 -0700
Use the #lock method to obtain a row lock on a single record. Simply reloads the record with :lock => true.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4462 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/lib/active_record/locking.rb')
-rw-r--r-- | activerecord/lib/active_record/locking.rb | 84 |
1 files changed, 0 insertions, 84 deletions
diff --git a/activerecord/lib/active_record/locking.rb b/activerecord/lib/active_record/locking.rb deleted file mode 100644 index 9e7564ed25..0000000000 --- a/activerecord/lib/active_record/locking.rb +++ /dev/null @@ -1,84 +0,0 @@ -module ActiveRecord - module Locking - # Active Records support optimistic locking if the field <tt>lock_version</tt> is present. Each update to the - # record increments the lock_version column and the locking facilities ensure that records instantiated twice - # will let the last one saved raise a StaleObjectError if the first was also updated. Example: - # - # p1 = Person.find(1) - # p2 = Person.find(1) - # - # p1.first_name = "Michael" - # p1.save - # - # p2.first_name = "should fail" - # p2.save # Raises a ActiveRecord::StaleObjectError - # - # You're then responsible for dealing with the conflict by rescuing the exception and either rolling back, merging, - # or otherwise apply the business logic needed to resolve the conflict. - # - # You must ensure that your database schema defaults the lock_version column to 0. - # - # This behavior can be turned off by setting <tt>ActiveRecord::Base.lock_optimistically = false</tt>. - # To override the name of the lock_version column, invoke the <tt>set_locking_column</tt> method. - # This method uses the same syntax as <tt>set_table_name</tt> - module Optimistic - def self.included(base) #:nodoc: - super - base.extend ClassMethods - - base.cattr_accessor :lock_optimistically - base.lock_optimistically = true - - base.alias_method_chain :update, :lock - class << base - alias_method :locking_column=, :set_locking_column - end - end - - def locking_enabled? #:nodoc: - lock_optimistically && respond_to?(self.class.locking_column) - end - - def update_with_lock #:nodoc: - return update_without_lock unless locking_enabled? - - lock_col = self.class.locking_column - previous_value = send(lock_col) - send(lock_col + '=', previous_value + 1) - - affected_rows = connection.update(<<-end_sql, "#{self.class.name} Update with optimistic locking") - UPDATE #{self.class.table_name} - SET #{quoted_comma_pair_list(connection, attributes_with_quotes(false))} - WHERE #{self.class.primary_key} = #{quote(id)} - AND #{lock_col} = #{quote(previous_value)} - end_sql - - unless affected_rows == 1 - raise ActiveRecord::StaleObjectError, "Attempted to update a stale object" - end - - return true - end - - module ClassMethods - DEFAULT_LOCKING_COLUMN = 'lock_version' - - # Set the column to use for optimistic locking. Defaults to lock_version. - def set_locking_column(value = nil, &block) - define_attr_method :locking_column, value, &block - value - end - - # The version column used for optimistic locking. Defaults to lock_version. - def locking_column - reset_locking_column - end - - # Reset the column used for optimistic locking back to the lock_version default. - def reset_locking_column - set_locking_column DEFAULT_LOCKING_COLUMN - end - end - end - end -end |