У меня есть некоторая логика в before_save
, при которой (только), когда выполняются некоторые условия, я позволяю создать новую строку с special_number
, равным максимальному special_number в базе данных + 1. (Если условия не выполняются затем я делаю что-то другое, поэтому я не могу использовать автоинкремент)
Меня беспокоит то, что два потока, действующих в этой базе данных одновременно, могут выбрать один и тот же special_number
, если второй выполняется при сохранении первого. Есть ли способ заблокировать базу данных между before_save
и завершением сохранения, но только в некоторых случаях? Я знаю, что все транзакции отправляются в транзакциях, это поможет мне?
def before_save
if things_are_just_right
# -- Issue some kind of lock?
# -- self.lock? I have no idea
# Pick new special_number
new_special = self.class.maximum('special_number') + 1
write_attribute('special_number',new_special)
else
# No need to lock in this case
write_attribute('special_number',some_other_number)
end
end