Похоже, вы используете Rails?Не уверен, почему вы пытаетесь свернуть свое собственное решение.Просто добавьте столбец lock_version
, чтобы включить оптимистическую блокировку на уровне БД.
https://api.rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.html
Также: поскольку вы говорите о нескольких машинах, параллелизм может происходить из нескольких процессов и из нескольких потоков.
Поскольку ваша устаревшая система ломается при добавлениистолбец блокировки некоторые другие решения:
0) Исправить проблемы с оптимистической блокировкой
1) использовать пессимистическую блокировку.В зависимости от сценария загрузки - сколько одновременных операций чтения / записи - это может также работать
2) Исправьте код блокировки (не совсем уверен, как он работает, потому что вы оставляете некоторые детали данного класса))
- не нужно поднимать, ловить и ре-рейз (просто используйте петлю и
break
при успехе) - вы звоните
to_f
на поплавках - Я не знаю, что
self.attributes = attributes
должен делать (из кода, который вы показываете, неясно, является ли attributes
чем-то иным, чем self.attributes
) - с использованием отметки времени может или не может бытьдостаточно для определения одновременных обновлений (могут быть сгенерированы две одинаковые метки времени, часы могут быть выключены на нескольких машинах, часы могут быть сброшены или настроены между ними)
- с использованием
sleep
- это запах кода
Когда вы пишете такой сложный код, что вам нужно спросить в интернете, работает ли он, то вы, вероятно, идете по неверному пути.Исправьте проблемы с оптимистической блокировкой вместо добавления такого обходного пути.