Хочу реализовать, что бы покупатель, отложив товар в свою корзину бронировал его , что бы остальные покупатели не могли его купить. В нормальной ситуации, когда он оформит покупку или очистит корзину понятно как делать. Но пользователь может набрать товара себе корзину и выйти с сайта. Как сделать что бы товар попал снова в продажу, скажем через 24 часа.
Варианта два. 1) Регулярно запускать чистящий скрипт, который будет проверять есть ли у какого юзера товары в корзине и корзина не обновлялась 24 часа. Если есть, то удаляет эту корзину. 2) Каждый раз как любой пользователь смотрит товар (или количество доступного товара) и это количество равно (или близко к) нулю, то автоматом проверять, не завалялось ли у кого "закорзиненого" товара возрастом более 24 часа. Если завалялос - см. пункт 1.
Геморрой точно будет, уверен, что бронирование нужно? Я бы предложил сделать по принципу "кто первый встал - того и тапки".
Johnatan сказал интересную мысль но я бы ее дополнил чисто идеологическим моментом: В базе данных в строке с инфой о товаре хранить как фактическое количество так и количество данного товара в резерве. При добавлении товара в поле "В резерве" не менять количество в поле "Фактически" ибо он есть фактически а то что в резерве мифически. Это позволит осуществлять быстрый расчет "свободного" товара а не сканить какую то таблицу на предмет а сколько там и у кого товара завалявшегося. Это позволит так же легко выводить инфу о том сколько товара реально есть и сколько в резерве, что не будет тебя самого сбивать с толку почему у тебя утром было 10 единиц товара ничего не продали а уже стоит всего 5 .. Просто будешь это поле забирать вместе с инфой о товаре сразу и все, расчет скриптом и никаких левых запросов в базу без необходимости. Ну и как следствие легко позволит реализовать пункт 2 от Johnatan В итоге можно сделать симбиоз. 1. Крон раз в сутки или чаще в зависимости от оборотов магазина. 2. Как только количество резерва приближается к количеству товара. В сумме два пункта дадут в худшем случае задержку со сбросом левого резерва в 24 часа для "тихих" товаров и по мере ухода в резерв "ходовых" товаров в течении 24 часов.
А бронирование если применить примерно то что я описал выше делается проще простого. Если фактическое количество товара равно товару в резерве то ничего забронировать нельзя или купить тоже нельзя. Если фактически 5 а в резерве 4 значит есть 1 свободная единица для продажи, если пользователь положил ее в корзину то помимо всех прочих операций по запоминанию данного момента кто че и кого в поле "в резерве" для данного товара делается +1 и в резерве становиться 5 и равняется полю фактически .. получается что товар пока ВЕСЬ в резерве и купить/зарезервировать больше его нельзя покуда резерв не освободиться или же нового не завезут. Все вроде просто и без гемора
Да и по пункту 2. Надо обязательно хранить последнее время когда скрипт делал очистку резервов, что бы если за 5 минут на страницу с товаром близким к нулю зайдет 100 человек скрипт не гонял 100 раз базу. Таким образом можно контролировать минимальный интервал между запуском скрипта отчисти резервов.