Я работаю над приложением, в котором один модуль обращается к журналу (модель ActiveRecord), чтобы увеличивать различные значения в нескольких точках выполнения. Проблема в том, что выполнение сценария может занять несколько секунд, а другие экземпляры этого же сценария могут выполняться в одно и то же время.
Что я вижу, так это то, что, хотя скрипт завершился правильно и все данные учтены, значения никогда не бывают правильными. Вероятно, это связано с тем, что к тому времени, когда сценарий достигает точки, в которой он обновляет значение, значение чтения для столбца (которое увеличивается) уже устарело.
Значения верны, если я заставлю его иметь только один экземпляр модуля за раз, но по соображениям производительности я не могу продолжать это делать.
В настоящее время я пытался решить эту проблему, запрашивая базу данных для записи перед каждым оператором приращения в транзакции, например, где column
является символом столбца, а value
равно 1 или выше:
Log.transaction do
log = Log.find(@log_id)
log.update_attribute(column, log.send(column) + value)
end
Однако, это все равно не даст мне точных цифр. Я думаю, что кеширование вовлечено, и я полагаю, что могу попробовать что-то вроде:
Log.transaction do
uncached do
log = Log.find(@log_id)
log.update_attribute(column, log.send(column) + value)
end
end
Но, конечно, я не могу быть первым, кто столкнулся с этой проблемой, поэтому мне интересно, есть ли лучшая реализация / решение для моей проблемы?