Jruby on Rails одновременно сохраняет на одном столе
Как я могу сохранить данные в одной и той же таблице, если два или более пользователей одновременно нажмут кнопку "Сохранить" с помощью Jruby? Вот код, который я уже пробовал
Sequence.transaction do
sq = Sequence.find_by_sequence_key('bus20158001', :lock => true)
sq.values = sq.values + 1
sq.save
end
Приведенный выше код не работает по ряду причин. Sequence - это моя модель, а ее поле (id, sequence_key, values, creation_at, updated_at)
1 ответ
"простой" ответ - вам нужно убедиться, что поиск, приращение и сохранение являются взаимоисключающими:
Sequence.exclusively do
Sequence.transaction do
sq = Sequence.find_by_sequence_key('bus20158001', :lock => true)
sq.values = sq.values + 1
sq.save
end
end
вам нужен общий глобальный мьютекс, например:
class Sequence
@@mutex = Mutex.new
def exclusively; @@mutex.synchronize { yield } end
end
пожалуйста, обратите внимание, что в целом это может быть источником раздора (особенно если find_by
занимает некоторое время, всегда глядя на базу данных) ...
... таким образом, другой ответ заключается в том, чтобы сделать значения "столбцом счетчика в виде атомарной" последовательности на уровне базы данных (например, вы можете обновлять его с помощью триггера при каждом сохранении на основе текущего наибольшего значения в таблице) .