Как избежать коллизий идентификатора базы данных в распределенной системе - PullRequest
0 голосов
/ 28 ноября 2018

Я пишу Java-приложение для класса информатики.Мой вопрос не является проблемой в рамках этого проекта, но может привести к хаосу в реальном мире и моих одноклассниках, и я не могу придумать решение.Это система, которая предназначена для работы на клиентах, а затем обращается к базе данных для чтения и записи информации.

Сценарий: объект заказа состоит из идентификатора заказа, некоторых других атрибутов и массива элементов.У каждого элемента есть идентификатор, поэтому для их хранения лучше всего было бы использовать таблицу, в которой каждая строка имеет идентификатор заказа и соответствующий идентификатор элемента.Пока все достаточно просто.Проблема в том, что для того, чтобы иметь уникальные идентификаторы, мы должны установить их в базе данных.Это легко сделать с помощью автоинкремента, теперь идентификатор заказа создается при вставке заказа в базу данных.Следующим шагом является получение этого нового идентификатора заказа из базы данных и его использование для добавления наших товаров во вторую таблицу.Основная проблема здесь заключается в том, что между этими двумя шагами кто-то может создать новый заказ, и это приведет к тому, что во втором созданном заказе будут назначены все элементы, а не первый заказ.

Мы понимаем модель клиент-серверисправил бы это, если бы один клиент взаимодействовал с базой данных, а не с несколькими, но действительно ли нет решения этой проблемы, кроме перехода на модель клиент / сервер?

1 Ответ

0 голосов
/ 28 ноября 2018

Автоматически увеличиваемые числа в идеале не являются правильным выбором, поскольку они дают возможность запрашивать и извлекать информацию на основе последовательно назначенного идентификатора.Это где UUID обычно входят в картину.Большинство баз данных предлагают генерацию UUID наряду с различными стратегиями.В вашем случае, поскольку вы пометили свой вопрос с помощью MySQL, вы можете взглянуть на следующую документацию

https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid

Предполагается, что значение, сгенерированное с помощью UUID, является уникальным (даже для всехмашины, логика генерации учитывает MAC-адрес).Как следует из документации, есть вероятность того, что он может потерпеть неудачу, но это очень редкий сценарий.

Другой вариант - создать собственный UUID, который учитывает идентификатор члена / узла при генерации случайной части.Это гарантирует, что у вас будут уникальные значения на разных хостах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...