TGViewer
SQL и Анализ данных SQL и Анализ данных @databases_tg · 12.5K subscribers
Post #1430 1.3K
Один товар, два покупателя. Как не продать больше, чем есть на складе?

Если сначала прочитать остаток через SELECT, а потом уменьшить его отдельным запросом, два покупателя могут одновременно увидеть последнюю единицу.

В PostgreSQL проверку и списание можно объединить:


UPDATE products
SET stock = stock - 1
WHERE id = 42
AND stock > 0
RETURNING id, stock;


Что получится при одновременных запросах:

• Первый покупатель уменьшит остаток с 1 до 0.
• Второй дождётся освобождения строки, и условие stock > 0 будет проверено повторно.
• Его запрос не обновит строку и ничего не вернёт — товар закончился.

Так работает обычный уровень изоляции PostgreSQL READ COMMITTED.

Добавьте защиту от отрицательных остатков:


ALTER TABLE products
ADD CONSTRAINT stock_nonnegative
CHECK (stock >= 0);


Списание остатка и создание заказа выполняйте в одной транзакции, чтобы при ошибке заказа изменение остатка тоже откатилось.
  • 🔥 7
  • ❤ 2
  • 👍 2
More from @databases_tg
  1. Sep 17, 2026🖥 Race condition в SQL: как продать последний товар дважды? Race condition в SQL: Дио и Д…
  2. Sep 15, 2026Post #1432
  3. Sep 14, 2026🔥 Один из лучших обучающих курсов на StepiK по SQL SQL можно знать годами и всё равно тер…
  4. Sep 13, 2026🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку Можно годами смотреть…
  5. Sep 11, 2026🐘 pgbot - диагностика PostgreSQL для AI-агентов и приложений, написанная на Go Один испол…
  6. Sep 9, 2026Post #1427
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →