Я сталкиваюсь с проблемой генерации следующего порядкового номера (вид номера счета). Требование:
Двойного номера нет.
Между этими номерами нет пропуска.
Обычный подход:
1. Find the last number
2. Increase value
3. Insert new number
Когда у нас есть несколько запросов одновременно, 3-й шаг первого запроса может быть еще не завершен, и первый шаг второго запроса уже запущен , и это приводит к дублированию номеров.
Есть несколько решений для этого
1. Использование транзакции и блокировки .
Плохо то, что там есть ожидание, и оно замедляет работу приложения. Кроме того, мы задействуем более 1 базы данных, что заставляет нас включать DT C на всех серверах БД и сервере приложений.
2. Использование Pre-Generate number и Azure Хранилище очередей
1. Предварительно создайте очередь, содержащую список номеров, которые вы собираетесь использовать
2. Откройте последний номер. Верните номер обратно в очередь, если есть исключение при его использовании. Ничего не предпринимать, если ничего не происходит
3. Автоматически вводить число sh каждую полночь (или каждый час)
4. Ручной ввод номера триггера функции, если его значение выходит за пределы
Мой вопрос: какой путь лучше, и есть ли другие решения для такого рода проблем.
ОБНОВЛЕНИЕ: Второй способ приносит потенциальную ошибку: двойной запрос (в то же время, как двойной щелчок пользователя) создаст 2 счета, что не то, что мы хотим. В конце мы используем Distributed Lock и не заботимся о транзакциях, используя DistributedLock library