В случае сомнений, пробник.
Рассмотрим следующую пару функций:
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, это говорит о том, что исключений не существует.Выдается, если второй процесс пытается заблокировать строку, которая уже заблокирована, но этот процесс блокируется, пока не завершится первый.