как по уму это реализовано в серьезных проектах?
Доступность товара проверяется перед оплатой. Кроме этого можно проверять еще и перед загрузкой страницы корзины. При добавлении в корзину остатки не списываются и ничего подобного не происходит. Относитесь к корзине, как к листу желаний и только. А вот оформление заказа - это уже другой разговор. Это уже намерение купить. Тут уже проверяем остатки, списываем остатки и т.д. Используем транзакции, для обеспечения целостности данных.