Coldfusion: блокировка таблиц базы данных для проверки ресурсов при покупке электронной коммерции - PullRequest
2 голосов
/ 03 мая 2011

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

Человек 1 отправляет свою корзину для продукта только с 1 оставленным. Код начинает списывать средства с их кредитной карты, сохраняя данные для входа в систему.

Человек 2 представляет свою корзину сразу за человеком 1 для того же продукта. Код человека 1 не дошел до того, что он уменьшает инвентарную стоимость продукта до 0. Поэтому код позволяет человеку 2 купить продукт.

Какой лучший способ предотвратить это? Я думаю, мне нужно поместить тег cftransaction вокруг кода, который выполняет все начисления, добавление информации для входа в систему и, наконец, уменьшение значения. Может ли простой тег cftransaction заблокировать базу данных от чтения до ее завершения? Я читал об уровнях изоляции, но я все еще в замешательстве. Нужно ли устанавливать специальный уровень изоляции для этой транзакции?

Ответы [ 3 ]

5 голосов
/ 03 мая 2011

Вы должны быть осторожны в том, сколько блокировок вы делаете, так как вы можете получить транзакции с тайм-аутом в ожидании освобождения блокировок - и недовольные клиенты!

У вас также есть другой сценарий: пользователь 1 и пользователь 2 помещают один и тот же предмет в свои тележки. Пользователь 1 полностью завершает оформление заказа. Пользователь 2 получает телефонный звонок, затем возвращается через 10 минут, чтобы закончить. Ваш процесс должен быть достаточно умным, чтобы повторно проверить товары в корзине до завершения покупки.

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

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

0 голосов
/ 04 мая 2011

Я бы порекомендовал вам использовать эксклюзивный cflock.

Если пользователь 1 будет первым в состоянии гонки, то он будет иметь первый приоритет. Как вы знаете, блокировка основана на принципе «первым пришел - первым обслужен». Он блокирует его, и, поскольку он имеет исключительную блокировку, пользователь 2 не может читать или изменять. Это позволяет избежать конфликта данных. Всегда обновляйте таблицу после оплаты.

0 голосов
/ 03 мая 2011

Просто идея, использовать HTML5 WebSockets или Flex Data Service, чтобы сделать инвентаризацию доступной для клиента в реальном времени?

...