Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Разработка информационных систем |
![]() ![]() |
swkx Member Откуда: Сообщений: 106 |
Привет. Системы бронирования просто как пример упомянуты для наглядности, хотя вопрос более общий: как предотвратить получение несколькими пользователями одинаковых результатов? Именно с программной точки зрения. В какой момент и какие куски данных нужно блокировать? Есть ли какие-то общие подходы? Возвращаясь к бронированию, возьмем к примеру один кинозал в одном городе. Два человека примерно одновременно выбирают себе места на один сеанс. Как их НЕ посадить на одно место? |
13 фев 20, 16:32 [22079395] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9431 |
Купить/поставить нормальную СУБД ? |
13 фев 20, 16:41 [22079409] Ответить | Цитировать Сообщить модератору |
swkx Member Откуда: Сообщений: 106 |
Вот меня и интересует, как решаются подобные задачи нормальными СУБД |
13 фев 20, 16:44 [22079412] Ответить | Цитировать Сообщить модератору |
irbis_al Member Откуда: Симферополь Сообщений: 1772 |
Почитайте про СУБД в формате версионник(Oracle,Postgres) и блокировочник(MS SQL,DB2 и т.д) Темы эти перетирались в разделе Сравнение СУБД |
||||
13 фев 20, 16:47 [22079416] Ответить | Цитировать Сообщить модератору |
s_ustinov Member Откуда: Munchen, DE Сообщений: 2209 |
ACID and Serializable Гуглим эти два слова. |
||||
13 фев 20, 21:18 [22079593] Ответить | Цитировать Сообщить модератору |
swkx Member Откуда: Сообщений: 106 |
Возможно, я некорректно вопрос сформулировал или ввел в заблуждение фразой "... с программной точки зрения". Тогда попробую совсем конкретно: тот же кинозал, осталось 10 (или 5, или 100, не суть) свободных мест. Два человека в одно и то же время разглядывают на сайте кинотеатра оставшиеся места и думают, какое из них выбрать. операция покупки - это промежуток времени от события "выбрал" до завершения оплаты. реально это несколько минут. Или полчаса. Тоже не принципиально. Напрашивается, что в момент выбора выбранное место должно быть каким-то образом закреплено за первым его выбравшим. Это действительно так? Если да, то как это происходит? Или процедура выбора обоими желающими (отметил одно, затем передумал, отметил другое и т.п.) никак системой не контролируется и если оба выбрали одно место, реально его получит первый завершивший оплату? |
13 фев 20, 22:49 [22079640] Ответить | Цитировать Сообщить модератору |
полудух Member Откуда: планета орков, г.Зверополис Сообщений: 1350 |
когда один выкупает место, другому JS (JavaScript) обновляет экран, после связи с сервером как они там обрабатывают "передумал" это они сами решают но вообще "бронь" это бронь. Сообщение было отредактировано: 14 фев 20, 00:49 |
14 фев 20, 00:49 [22079679] Ответить | Цитировать Сообщить модератору |
Изопропил Member Откуда: Сообщений: 31548 |
swkx, Оптимистическая блокировка |
14 фев 20, 09:18 [22079740] Ответить | Цитировать Сообщить модератору |
s_ustinov Member Откуда: Munchen, DE Сообщений: 2209 |
Обычно включается таймер - оплатить в течении 10 минут или похожее. На это время место блокируется и пропадает из свободных. Если оплатил - остаётся тебе. Не успел оплатить - снова становится свободным. |
||||
14 фев 20, 09:56 [22079763] Ответить | Цитировать Сообщить модератору |
МодальноеОкно Member Откуда: Сообщений: 5148 |
выдается один и тот же guid объекта (места) двум юзерам. при записи - которая возможна если гуид текущий места и тот с которым пришел клиент обратно в субд одинаков. версия объекта после записи обновляется - соответственно второй клиент получает неравенство текущей версии гуида объекта (места) и того гуида который он получал. ему сообщается, что "поезд ушел" и надо обновлять данные по свободным местам заново. вам же написали про версионники и блокировочники - смотрите в вики |
||||
14 фев 20, 09:58 [22079765] Ответить | Цитировать Сообщить модератору |
Alibek B. Member Откуда: Сообщений: 3826 |
Свободные объекты доступны для одновременного выбора. В момент, когда пользователь нажимает «Забронировать», объект резервируется за данным пользователем на определенный период. Если он за этот период подтвердит броню (оплатит заказ), то он за ним и остается. Если не подтвердит, то резерв снимается. Если другие пользователи попытаются забронировать резервированный или использованный объект, то получат сообщение о том, что он уже занят, нужно выбрать другой объект. Бэкэнд должен иметь метод «Забронировать», при вызове которого он либо осуществляет резервирование, либо возвращает ошибку. |
14 фев 20, 10:45 [22079802] Ответить | Цитировать Сообщить модератору |
monstrU Member Откуда: Москва Сообщений: 1228 |
ну вопрос бронирования это ни в коем случае не вопрос СУБД, а вопрос приложение. Допустимо бронирование билета или нет. то есть когда пользователь1 и пользователь2 загрузили посмотреть себе список билетов одновременно, пользователь1 забронировал билет с местом 10 , у него поставили флаг БРОНЬ. когда пользователь2 стал бронировать билет 10, то попытка брони должна завершиться с отказом, так как билет 10 уже в брони. тут возникает вопрос, когда обе операции пойдут одновременно - тут уже блокировками СУБД можно воспользоваться - надо обеспечить, чтобы запрос билета на смену флага мог выполнить только один пользователь. вот конкретно эту операцию разумно СУБД поручить. во всяком случае примерно так наша билетная площадка работает |
14 фев 20, 15:24 [22080113] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9431 |
IMHO Зависит от дизайнера/заказчика системы. Можно сделать и так и этак Например в Ulmart, Ozon я вполне могу забронировать товар и его не забрать (не купить). Не только в базе запись будет заблокирована, но возможно даже пара грузовиков туда-сюда сьездят. Ulmart / Ozon ничего особо плохого в этом не видят. Если интресует, как сделано на конкретном сайте - ну сделайте опыт. Купити пару авиабилетов и посмотрите, как поведет себя система. Делов-то на пару тысячь(десятков тысячь, если весь остаток на рейс покупать) $ ))) |
||||
14 фев 20, 15:37 [22080120] Ответить | Цитировать Сообщить модератору |
Все форумы / Разработка информационных систем | ![]() |