Мое веб-приложение имеет класс WorkItem
с RecordID
(Guid as Primary Key) и FriendlyID
(строка), который состоит из Type-Date-RandomNumbers
.
Если я создаю новый WorkItem, я также создаю новый FriendlyID.
Формат FriendlyID не может быть изменен (спецификация клиента) и имеет вид <Type (one char)>-<Current Date (yyymmdd)>-<6 random numbers>
.
private string GenerateFriendlyID()
{
string res = String.Empty;
// code omited
// ...
// IT'S NOT THE QUESTION HOW TO PROGRAM THIS METHOD!
// It's about the fastest and best way/design to make
// sure the generated ID is unique! (see below)
return res; // sth like "K-20110930-158349"
}
public override void Create()
{
if (String.IsNullOrEmpty(friendlyID))
{
GenerateFriendlyID();
}
base.Create();
}
Этот код дает сбой при большой нагрузке, поэтому я получаю одни и те же FriendlyID несколько раз.
Как лучше всего убедиться, что мой дружественный идентификатор уникален?
- Создайте УНИКАЛЬНОЕ ограничение на FriendlyID в БД.
- Начать транзакцию, сгенерировать FriendlyID, вставить и зафиксировать
- Откат и попробуйте еще раз, если я получу SQLException.
- Просто создайте это.
- Выберите все рабочие элементы с помощью
this.FriendlyID
.
- Если выбрано значение
> 1
, повторять до тех пор, пока оно не станет == 1
Я уверен, что есть другой способ, но Я думаю, # 1 должен быть предпочтительным.
Есть ли какие-то пути, по которым я скучаю, или путь №1? Я ненавижу использовать исключения для моего рабочего процесса, и я знаю, что они действительно медленные.