Стек: Java 11, PostgreSQL 12+, JDBC, Spring Boot, Hibernate
Цель: понять, когда использовать SELECT FOR UPDATE, как он блокирует строки, какие есть альтернативы, и как фреймворки управляют блокировками “под капотом”. Представьте: два пользователя одновременно пытаются купить последний товар на складе. Без блокировок: Итог: товар продан дважды, хотя был один. 💡 Решение: заблокировать строку при чтении, чтобы другой поток не мог её прочитать до завершения транзакции. SELECT * FROM products WHERE id = 1 FOR UPDATE; ⚠️ Важно: блокировка удерживается до конца транзакции (COMMIT или ROLLBACK). ✅ Ключевые моменты:Транзакция обязательна,
Блокировка автоматически снимается при коммите,
Не используйте FOR UPDATE вне транзакции — это бессмысленно.
PostgreSQL использует MVCC (Multi-Version Concurrency Control), но для блокировок применяет дополнительный механизм: SELECT * FROM products WHERE id = 1 FOR UPDATE NOWAIT; Блокировка SQL Описание FOR UPDATE SELECT ... FOR UPDATE Эксклюзивная бл