0

Чтобы получить лучшее понимание пессимиста замок (с InnoDB), я попытался запустить этот код в моем приложении Rails:Тестирование пессимистического замка с Rails

Thread.new do 
    Account.transaction do 
    account = Account.lock(true).first 
    account.balance += 250 
    account.save! 
    end 
end 

Thread.new do 
    Account.transaction do 
    account = Account.lock(true).first 
    account.balance += 500 
    account.save! 
    end 
end 

Это на самом деле работает, account.balance затем содержит 750, то 1500 на следующий хит. Без блокировки он учитывает последний поток, и результат 500.

Это тупой тест, чтобы попробовать разницу между блокировкой или нет? I думаю Я понимаю принцип пессимистской блокировки, но не уверен, хотя.

ответ

0

Этот тест позволяет наблюдать пессимистическое поведение при блокировке, но при удалении замков он не переключается на оптимистичную блокировку. Он просто не блокирует вообще.

Кроме того, чтобы быть более идиоматических вы могли бы сделать это:

Thread.new do 
    account = Account.first 
    account.with_lock do 
    account.balance += 250 
    account.save! 
    end 
end 

with_lock начинает транзакцию и получает блокировку в один присест.

Чтобы наблюдать за оптимистичным поведением блокировки, вам нужно поле lock_version, которое будет присутствовать в вашей модели. Затем Rails автоматически выполнит регистрацию проверки версии и отбросит ActiveRecord::StaleObjectError на конфликт.

Смежные вопросы