@censor2005

Как получить последнюю актуальную строку таблицы при параллельных запросах?

Есть таблица datas:
id | last_data
------------
1 | 25000
2 | 75000
...
Время от времени в таблицу вставляются новые данные по следующему алгоритму: last_data = предыдущее last_data + 50000. Для этого я с помощью
SELECT last_data FROM datas ORDER BY id DESC LIMIT 1
получаю последнее значение, прибавляю 50000 и делаю INSERT новой строки

Теперь, если будет приходить много параллельных запросов на вставку, возможна ли ситуация, что два запроса получат один и тот же last_data (например, 75000), и оба вставят одинаковую новую строку (125000)? По идее, мне нужно чтобы вставились значения 125000 и 175000.

В проекте используется Laravel
  • Вопрос задан
  • 181 просмотр
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Либо транзакция с блокировкой таблицы, либо атомарный запрос, типа
INSERT INTO `table` (`last_data`)
  WITH `cte` (`max`) AS (
    SELECT MAX(`last_data`)
      FROM `table`
  ) SELECT `max` + 50000 FROM `cte`;
Ответ написан
Комментировать
rozhnev
@rozhnev Куратор тега SQL
Fullstack programmer, DBA, медленно, дорого
Нет смысла в прибавлении - нужно хранить только разницу А сумму получать при выборке данных:
SELECT 
	id,
	diff,
	SUM(diff) OVER (ORDER BY id ASC)
FROM t;


MySQL fiddle here
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы