2014-11-10 3 views
0

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

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

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

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

+0

Вместо блокировки на уровне базы данных вы считаете, что используете [Семафор] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html)? –

+0

Если у вас есть личность, и вы никогда не удаляете личность, вместо того, чтобы делать счет, вы можете max и min, а затем просто вычитать их друг от друга, чтобы получить счет сразу. – Hozikimaru

ответ

2

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

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

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