У меня есть 3 таблицы
Продукты
product_id
max_products_can_sell
max_products_can_sell_to_individual
покупок
user_id
product_id
product_id *1012* product_id *1011* product_id *1011* product_id *1012*количество
резервирование
product_id
user_id
количество
Надеюсь, вы поняли структуру.
Теперь, когда когда-либо пользователь пытается купитьпродукт, я должен проверить оставшиеся позиции по max_products_can_sell - (проданное количество + зарезервированное количество).
Если товары доступны, я должен хранить их в таблице резервирований, пока он не совершит покупку.(Будет выполнять ведение домашнего хозяйства через cron для этой таблицы)
Теперь актуальный вопрос: как решать проблемы параллелизма здесь.Например: ручка продукта имеет только 1.два пользователя запрашивают Reserve.php.
"a" запрос пользователя Reserve.php и доступное перо 1.но перед вставкой, для "b" пользователю доступно перо 1.поэтому два пользователя оставляют за собой ручку.
Я использую таблицу innodb.Как с этим справиться?
EIDT
$query = SELECT count(*) as sold FROM purchases WHERE product_id = 1;
$query = SELECT count(*) as reserved FROM reservations WHERE product_id = 1;
$items_remaining = $sold+$reserved;
if ($items_remaining) {
//INSERT data to reservations
}
Теперь мне нужно убедиться, что никакие другие запросы не будут мешать и выполнять тот же SELECT (читая «старое значение»).'до того, как это соединение завершит обновление строки.
Как сказал Dan , я могу заблокировать таблицу TABLES, чтобы убедиться, что только одно соединение делает это одновременно, и разблокировать ее, когда ясделано, но это кажется излишним. Будет ли перенос в транзакцию делать то же самое (гарантируя, что никакое другое соединение не попытается выполнить тот же процесс, пока другое все еще обрабатывает)? Или будет SELECT ... FOR UPDATE или SELECT ...LOCK IN SHARE MODE будет лучше?
Я не понимаю, использовать ли транзакции или таблицы блокировки или использовать обе. Пожалуйста, предложите мне ..
EDIT2
ВВ таблице товаров есть еще одно поле, которое называется max_can_sell_to_individual. Я должен проверить текущий инвентарь, а также проверить личный лимит.
Я могу поддерживать запас (есть в наличии), но у меня нетТакже необходимо проверить индивидуальный лимит.Это можно найти в таблице покупок.
Подскажите, пожалуйста, как мне с этим справиться?
Заранее спасибо!