У нас есть таблица elements
, которая может быть issued
клиентам. Эти elements
могут быть предоставлены только клиенту один раз, и у нас есть ситуации, когда многие клиенты могут одновременно вытягивать элементы. Затем нам нужно вернуть связанные с ним данные (так что есть обновление, а затем выберите).Выбор и обновление строки при работе с условиями гонки?
В настоящее время решение состоит в том, что случайный один найден/обновляется, чтобы быть issued=true
и устанавливает его id
в LAST_INSERTED_ID
; затем сразу же после этого выбирает вызов для поиска where('id = LAST_INSERTED_ID()')
, который является уникальным для каждого соединения.
Поскольку мы обновляем, где issued=false
- issued=true and [last inserted]
, этот вызов достаточно мал, чтобы не встречаться с проблемами состояния гонки.
Но, все это делается в SQL и чувствует себя очень хак. Это не похоже на достаточно редкую проблему, что она не была решена с использованием более Railsy решения. Обертка транзакции может работать для предотвращения двойных проблем, но тогда нам понадобится повторная логика в случае неудачной транзакции.
Какое решение мы не думали?
Я не имею тонну опыт здесь, и это мне интересно. Вы находите и обновляете 'issu = true' в одном запросе базы данных? Как вы это достигаете? –
Можете ли вы разместить свои вопросы, пожалуйста –