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 занимает некоторое время, всегда глядя на базу данных) ...

... таким образом, другой ответ заключается в том, чтобы сделать значения "столбцом счетчика в виде атомарной" последовательности на уровне базы данных (например, вы можете обновлять его с помощью триггера при каждом сохранении на основе текущего наибольшего значения в таблице) .

Другие вопросы по тегам