Как избежать блокировки БД

Я работаю над бэкендом игры. Игроки сначала покупают билеты, которые сохраняются в базе данных, затем играют и могут выиграть определенные призы. Каждый игрок может купить максимум 60 билетов.

Появилось новое требование, устанавливающее верхнюю границу общего количества билетов на игру – 10 000 билетов. Реализация будет включать добавление к конечной точке покупки теста, проверяющего, что общее количество купленных билетов в это время + количество билетов, требуемых для текущей покупки, меньше или равно максимальному количеству билетов для этой игры, чтобы покупка была завершена. быть принятым.

Проблема заключается в том, что при вычислении текущего количества купленных билетов с помощью count в таблице Tickets возвращаемое значение может быть устаревшим, поскольку в это время другие игроки могли приобрести билеты.

Возможное решение — заблокировать таблицу билетов во время покупки, но это может негативно сказаться на производительности и взаимодействии с пользователем. Пожалуйста, дайте мне знать, если у вас есть другая идея.


person user998692    schedule 10.11.2014    source источник
comment
Рассматривали ли вы вместо блокировки на уровне базы данных использование Семафор?   -  person John R    schedule 10.11.2014
comment
Если у вас есть личность, и вы никогда не удаляете ее, вместо подсчета вы можете макс и мин, а затем просто вычесть их друг из друга, чтобы получить счет немедленно.   -  person Hozikimaru    schedule 10.11.2014


Ответы (1)


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

На самом деле может быть сложно заставить вашу игру демонстрировать последовательное поведение вообще без соответствующей блокировки в БД. С другой стороны, вам, вероятно, не нужна явная блокировка. Если вы настроите свою базу данных с соответствующим уровнем изоляции транзакций, она должна выполнять все необходимые блокировки за вас.

Поскольку здесь нет явного выигрыша, я рекомендую отложить вопрос о производительности до тех пор, пока вы не сможете проверить свою производительность. Если окажется, что это недостаточно хорошо, вы можете определить на основе фактических измерений, какие части системы могут получить наибольшую пользу от настройки.

person John Bollinger    schedule 10.11.2014