StrangeAttractor
@StrangeAttractor

Как бороться с дублированием идентификаторов в многопользовательском приложении без использования на уровне таблицы?

Представьте себе банальную реляционную структуру с целочисленными идентификаторами, не несущими смысловой нагрузки. Ну и надо написать web-приложение с этой базой работающее (в т.ч. добавляющее новые элементы). Автоинкремент на уровне определения таблицы использовать нельзя. Приложение многопользовательское, так что если просто запросить максимальный ID ситуация с ним может измениться быстрее, чем ты успеешь отправить запрос на вставку на основе этой информации. Какие тут есть варианты? Никаких библиотек типа ORM / Persistance не используем.

Язык PHP выбран условно как наиболее всем понятный, в принципе можно любой другой, главное - чтобы из ответа была видна вся логика (а не просто "берём библиотеку такую-то и она обо всём позаботится сама") и её можно было без проблем реализовать на, грубо говоря, любом языке.
  • Вопрос задан
  • 2261 просмотр
Пригласить эксперта
Ответы на вопрос 5
nazarpc
@nazarpc
Open Source enthusiast
Зачем запрашивать максимальный id? Сделайте поле AUTOINCREMENT, и оно будет без конфликтов инкрементиться само.
Ответ написан
Комментировать
Используйте
SELECT LAST_INSERT_ID()

Из документации:

The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.


Так что запросы других клиентов никак не повлияют на результат.
Ответ написан
AMar4enko
@AMar4enko
Вариант в лоб - сделать свою таблицу для хранения текущих счетчиков.
В транзакции UPDATE ids SET id = id + 1, SELECT ids.id
И полученный id используете для вставки.
Или использовать для хранения счетчиков redis.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
если просто запросить максимальный ID ситуация с ним может измениться быстрее, чем ты успеешь отправить запрос на вставку на основе этой информации. Какие тут есть варианты?

INSERT ....IF NOT EXISTS(....)
одна транзакция, а они - последовательные.
Ответ написан
Комментировать
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Используйте UUID/GUID, как раз для этих целей
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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