Принятие я делаю что-то вроде этого (от Активных Рекордных Запросов руководства)
Item.transaction do
i = Item.first(:lock => true)
i.name = 'Jones'
i.save
end
Блокировка автоматически выпущена в конце транзакции? Я посмотрел на Активное руководство Запроса и ActiveRecord:: Блокировка:: Пессимистические документы, и не могли найти, где это явно говорит, где блокировка выпущена.
Блокировка не является функцией rails, это просто добавление оператора блокировки к запросу, который будет зависеть от базы данных, которую вы используете. Пессимистическая блокировка придерживается "пессимистического" взгляда, считая, что каждый запрос подвержен повреждению. Поэтому она будет блокировать выбранные строки, пока вы не завершите транзакцию. так что Lock > query > unlock. Несмотря на то, что эти правила достаточно последовательны для разных баз данных, было бы неплохо прочитать документацию по используемой вами базе данных, чтобы узнать все специфичные для нее вещи.
Вот хорошая тема об оптимистической и пессимистической блокировке, которая объясняет это лучше, чем я могу. Оптимистическая и пессимистическая блокировка
Я считаю, что вам нужен блок «обеспечения», чтобы убедиться, что блокировка снята.
http://ruby-doc.org/core/classes/Mutex.src/M000916.html содержит:
def synchronize
lock
begin
yield
ensure
unlock
end
end
http://yehudakatz.com/2010/02/07/the-building- Blocks-of-ruby / , похоже, предполагает, однако, что блочная структура этого метода будет автоматически разблокирована.