Когда несколько пользователей редактируют одну запись, можно избежать конфликтов с помощью оптимистической блокировки — без явного
FOR UPDATE.Создаём таблицу с версией записи:
CREATE TABLE products (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT,
price DECIMAL(10,2),
version INT DEFAULT 1 NOT NULL
);
Выбираем запись для редактирования:
SELECT id, name, price, version
FROM products
WHERE id = 1;
Обновляем с проверкой версии:
UPDATE products
SET price = 199.99,
version = version + 1
WHERE id = 1
AND version = 1;
Если другой пользователь уже изменил эту строку,
UPDATE не затронет ни одной записи — значит, версия изменилась, и данные устарели.Приложение должно проверить, что
rows_affected = 1, и при необходимости повторить попытку или показать сообщение об ошибке.Проверяем результат:
SELECT * FROM products WHERE id = 1;
🔥 Такой подход предотвращает «потерю обновлений» без длительных блокировок чтения и подходит для большинства современных СУБД.
➡️ SQL Ready | #практика