Я читаю "The Rails 5 Way", и на странице 191 я вижу следующее:
Пессимистическая блокировка происходит на уровне базы данных. ВЫБОР
оператор, сгенерированный Active Record, будет иметь значение UPDATE (или
похоже) добавлен пункт ...
Документы Rails содержат ту же информацию:
Locking :: Pessimistic обеспечивает поддержку блокировки на уровне строк, используя
ВЫБРАТЬ… ДЛЯ ОБНОВЛЕНИЯ и других типов блокировки.
Цепочка ActiveRecord :: Base # найти ActiveRecord :: QueryMethods # заблокировать
получить эксклюзивный замок на выбранные строки:
Account.lock.find(1)
# ВЫБРАТЬ * ИЗ СЧЕТОВ, ГДЕ id = 1 ДЛЯ ОБНОВЛЕНИЯ
В качестве эксперимента я хотел воспроизвести это утверждение FOR UPDATE
на моей локальной машине. Я знаю, что способ инициировать транзакцию с пессимистической блокировкой - это вызвать метод класса .lock
(в книге приведен пример t = Timesheet.lock.first
). Поэтому я запустил следующий код в REPL игрушечного приложения Rails (v 5.1.6), которое содержит класс Order:
irb(main):015:0> Order.transaction do
irb(main):016:1* o1 = Order.lock.first
irb(main):017:1> o1.update_attributes(name: 'Foo Bar')
irb(main):018:1> end
Это привело к следующему выводу:
(0.3ms) begin transaction
Order Load (0.2ms) SELECT "orders".* FROM "orders" ORDER BY "orders"."id" ASC LIMIT ? [["LIMIT", 1]]
SQL (1.1ms) UPDATE "orders" SET "name" = ?, "updated_at" = ? WHERE "orders"."id" = ? [["name", "Foo Bar"], ["updated_at", "2018-11-04 03:01:35.593868"], ["id", 1]]
(0.4ms) commit transaction
=> true
Я не вижу FOR UPDATE
ни в операторах SELECT
, ни UPDATE
. Я делаю что-то не так при попытке указать пессимистическую блокировку? Или у меня неверное ожидание того, какой SQL должен выводиться?