Конкурентное удаление строк, если их больше 5
Postgresql. Есть таблица с сессиями юзера:
CREATE table user_sessions (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL
)
У юзера не может быть больше 5 сессий, поэтому если появляется новая сессия то требуется удалить самую старую. Таким образом:
INSERT INTO user_sessions (user_id) VALUES (1);
DELETE FROM user_sessions WHERE user_id=1 AND id NOT IN (
SELECT id FROM user_sessions WHERE user_id=1 ORDER BY ID DESC LIMIT 5
)
Это работает, второй запрос удалит самые старые сессии, если сессий у юзера будет больше 5. Но я переживаю за параллельные запросы. Кажется, что DELETE может удалить только что созданную сессию, потому что её ещё не существовало на момент выполнения SELECT оператора, но она существовала на момент выполнения DELETE оператора и условие NOT IN выполнится для только что созданной сессии, как это можно обойти?
Источник: Stack Overflow на русском