Лучший способ для генерации последовательных уникальных значений

0

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

Например, у меня есть база данных mysql, сбалансированная по нагрузке. Мое приложение PHP, развернуто с докером и имеет 3 контейнера

Я должен генерировать последовательные идентификаторы. Я не могу использовать автоматическое увеличение, потому что я должен генерировать уникальные идентификаторы в зависимости от отношений (например, я должен генерировать уникальный номер счета, в зависимости от общества ведьмы, это связано)

Мой счет может быть сгенерирован, но не включен. Я должен создать уникальное значение, когда выставляется счет.

TRIGGER ON UPDATE - хорошее решение или нет?

Thnks для ваших ответов

  • 1
    «Я должен создать уникальный номер счета в зависимости от того, с каким обществом это связано». Это плохое требование ИМО. Номер счета должен быть просто числом. Другие метаданные могут содержать информацию о том, к какому клиенту они относятся. И что вы подразумеваете под «испущенным» - вы имеете в виду, когда он отправляется клиенту? Почему вы должны ждать до тех пор, пока не создаст номер? Есть ли какая-то настоящая деловая причина для этого?
  • 0
    Требование плохое, но это то, что хочет клиент, и он позволяет сортировать файлы. Счет может быть сгенерирован и не сразу утвержден, потому что пользователь может изменить его содержание. Когда счет подтвержден, он действителен и «эмитирован». На данный момент мне нужно сгенерировать свой идентификатор, потому что, если счет отменен и не выдан, у меня не должно быть дыры в моем списке сгенерированных идентификаторов.
Показать ещё 4 комментария
Теги:

2 ответа

0

Я бы сохранил текущий идентификатор в таблице db. Каждый раз, когда вы хотите увеличить id, выполните следующие действия:

  • Начать транзакцию
  • Заблокировать строку id в таблице db: в mysql использовать FOR UPDATE
  • Прочитать текущий идентификатор
  • увеличить идентификатор
  • сгенерировать счет с идентификатором
  • Сохраните идентификатор обратно в db
  • Зафиксировать транзакцию
-3

Я бы пошел на MAX (id) +1. Вы можете получить следующий номер в последовательности с запросом типа:

SELECT COALESCE(MAX(id),0) + 1 FROM bill
 WHERE society = 'XYZ'

Вам нужно будет предпринять шаги для обеспечения того, чтобы два процесса не генерировали одинаковое число, и это может быть сложным, но не непреодолимым.

Лично я всегда избегал триггера. Я никогда не использовал триггер и не сожалел об этом позже.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню