Какое исключение вызывает ActiveRecord :: lock !? - PullRequest
2 голосов
/ 10 июня 2011

Я использую блокировку!в моем коде и хочу поймать исключение, если бросить блокировку!не удается по какой-то причине (например, не удается получить блокировку).Какие исключения можно заблокировать!бросить?Я проверил документацию по ruby, но не смог найти конкретные классы Exception.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2016

В случае сомнений, пробник.

Рассмотрим следующую пару функций:

def long_hold
  ActiveRecord::Base.transaction do
    u = User.find(220)
    u.lock!
    sleep 100.seconds
    u.email="foo@bar.com"
    u.save!
  end
end

def short_hold
  ActiveRecord::Base.transaction do
    u = User.find(220)
    u.lock!
    u.email="foo@bar.com"
    u.save!
  end
end

В моей настройке (OSX 10.11, ruby ​​2.2.4, rails 4.2, postgres 9.5),запустив long_hold в одной консоли рельсов, а затем запустив short_hold во второй консоли, я наблюдаю блоки short_hold до тех пор, пока long_hold не завершится;более того, обрабатывая код путями, мы видим, что пока long_hold спит, short_hold ожидает получения блокировки.

Если не поступать предостережения о независимости консолей rails, это говорит о том, что исключений не существует.Выдается, если второй процесс пытается заблокировать строку, которая уже заблокирована, но этот процесс блокируется, пока не завершится первый.

1 голос
/ 10 июня 2011

Вот источник для этого блокирующего вызова . Он вызывает перезагрузку, и его источник выглядит так:

          # 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

поэтому, когда вы вызываете reload (: lock => lock), поскольку вызов lock делает это, он действительно обновляет атрибуты этой записи.

Здесь много разных ситуаций. Вы можете попытаться заблокировать запись, которая не существует, или заблокировать запись, которая была заблокирована в другом месте. Какую ошибку вы заинтересованы в ловле?

...