это воспроизводите
Смотрите, прямо по тексту: CREATE TABLE accounts(account_id serial PRIMARY KEY, balance numeric NOT NULL); INSERT INTO accounts(balance) VALUES (1000); -- Например, две транзакции собираются увеличить сумму на одном и том же счете на 100 ₽. --- сессия 1: BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; -- Первая транзакция читает текущее значение (1000 ₽), SELECT balance FROM accounts; -- получается 1000 -- затем вторая транзакция читает то же значение. --- сессия 2: BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT balance FROM accounts; -- получается 1000 --- сессия 1: -- Первая транзакция увеличивает сумму (получается 1100 ₽) и записывает это значение. UPDATE accounts SET balance = 1100; -- это 1000 + 100 COMMIT; -- Вторая транзакция поступает так же — получает те же 1100 ₽ и записывает их. UPDATE accounts SET balance = 1100; -- это 1000 + 100 COMMIT; -- В результате клиент потерял 100 ₽. Т.е., да, потерял. Аккуратнее примеры надо писать / давать определения. Вообще, "потерянным обновлением" иногда называют две совершенно разные аномалии. Так вот, стандарт SQL запрещает не эту. ;)
Обсуждают сегодня