У меня есть сложная бизнес-логика, которая запускается при выполнении действия контроллера. Логика выполняет различные обновления множества различных таблиц/записей, связанных с пользователем. Однако метод модели, вызываемый контроллером, склонен выполняться несколько раз одновременно, если маршрут выполняется достаточно быстро последовательно.
Я хочу убедиться, что метод модели не запускается, если он уже находится в процессе из-за предыдущего запроса.
Я кое-что прочитал, и похоже, что блокировка базы данных может быть тем, что мне нужно, но мне не ясно, какой вид блокировки я хочу, и действительно ли я хочу ее для своего сценария. Я неопытен в проблемах такого рода.
Моя логика не просто обновляет одну запись, она обновляет запись пользователя, а также множество разных записей, связанных с этим пользователем, во многих таблицах. Мне кажется неправильным добавлять lock_version
к каждой отдельной таблице, но, может быть, это нормально? Я думаю, что я хочу, чтобы пользователь и связанные с ним записи были заморожены во время работы этого метода, поэтому я ищу лучший способ добиться этого.
Каков способ Rails справиться с этим (надеюсь) с минимально возможной дополнительной сложностью? Если мне нужна блокировка, нужно ли добавлять столбец lock_version
к каждой отдельной модели, которая обновляется в результате этой логики?
a rails way
это можно сделать, это будет зависеть от каждого конкретного случая, но вы не даете четкого описания своей системы. Я понимаю, что вы хотите предотвратить слишком быстрое попадание пользователя в одну и ту же конечную точку, поэтому, возможно, вам поможет что-то вроде регулирования атаки стойки github.com/rack/rack-attack#throttling - person arieljuod   schedule 05.06.2021User.with_advisory_lock("finish_activity", transaction: true) do { my_method}
, иcurrent_user.with_advisory_lock("finish_activity", transaction: true) do { my_method }
. Я все еще могу открыть 5 вкладок браузера и иметь дублирующиеся завершения, если код завершается в ту же секунду. Я использую постгрес. - person David Gay   schedule 06.06.2021