У нас есть требование, в котором говорится, что когда мы получаем нового человека в базу данных, нам нужно присвоить им уникальный номер. Это число начнется с определенного номера, когда система войдет в актив. Итак, если клиент скажет: «Начните с 500 000!», Тогда первый выделенный идентификатор будет 500000.Обращение с добавочным номером с помощью DB
Easy - Auto increment fiend.
Однако ID
является Account Number
, который отправляется внешнему клиенту для связывания человека с учетной записью. Возможно, идея заключалась в использовании первичного ключа auto inc, но я считаю, что плохо использовать ПК в качестве внешнего лица «номер человека».
Кто-то упомянул о наличии таблицы с auto inc pk и идентификатором таблицы лиц, к которому мы добавляем номер. Но это кажется странным.
Моя идея - добавить новый столбец в нашу таблицу settings
, которая действительно имеет только одну строку и содержит системные настройки для системы. Столбец будет INT
и будет называться NextAvailableId
. Все строки имеют столбец Version
, который является Timestamp
(RowVersion
).
Мой план создать функцию под названием GetNextId
или что-то, что бы просто сделать следующее:
- Создать переменную
@AssignedID
- Создать переменную
@Version
- Получить
NextAvailableId
от таблицу настроек, а также версию. Set AssignedID = NextAvailableId
- Обновление таблицы параметров, настройка
NextAvailableId = AssignedID + 1 WHERE version = @Version
- Проверьте обновленное количество строк. Если это 1, нам удалось получить последний идентификатор, увеличить его и сохранить обратно в таблицу, прежде чем другой процесс получит идентификатор.
- Если обновленное количество строк было равно нулю, то кто-то схватил число перед нами ... так что попробуйте еще раз, пока у нас не будет обновленной строки.
Это звучит как безопасный и действительный план присвоения «номеров счетов» моему лицу?
Обратите внимание: его нет на самом деле человека или код учетной записи. Это идентификатор поставщика, который должен быть применен к человеку для хранения в отдельной системе. Просто использование Person и Account в качестве (плохого) примера.
Что мне нужно сделать, это найти способ обработки уникального распределения «Номера счетов». Если ручной способ - плохая идея, и есть лучший способ - тогда это мне очень помогло бы.
Если вы решили использовать свою схему * ручной * ручной настройки, вы должны сделать ** абсолютно уверенным **, что ваша инкрементная функция является ** параллельной безопасностью ** даже при большой нагрузке. И это нелегко ** выполнить! –
Спасибо @marc_s. Да, это то, что я пытаюсь сделать. Таким образом, обеспечение доступного идентификатора, используя версию строки, кажется мне довольно безопасным. Но, может быть, я что-то упустил? Блокировка? – Craig
[См. Этот другой вопрос SO и ответ Ремуса Русану] (http://stackoverflow.com/questions/5083846/sql-server-2005-using-generated-sequences-instead-of-identity-columns), как это сделать ** безопасно ** –