Каков наилучший способ создания OrderId для банковских транзакций? - PullRequest
0 голосов
/ 12 февраля 2012

Мне нужно создать 9-значный идентификатор заказа без начальных нулей.Каков наилучший способ сделать это?

Я думаю следующее: создать таблицу с уникальным столбцом идентификатора, а затем сгенерировать случайное число от 100000000 до 999999999 в коде C # и попытаться вставить его в таблицу.пока я не буду успешным.Каковы шансы получить в этом уникальное исключение ограничения и заново сгенерировать число?

Если я думаю в правильном направлении, есть ли способ сделать это на самом сервере sql вместо обработки исключения вкод C #, а затем заново сгенерировать?

Или есть ли другой лучший способ сделать это?

Спасибо

Ответы [ 4 ]

1 голос
/ 12 февраля 2012

Если ваша цель - создать, казалось бы, уникальный уникальный идентификатор транзакции, я предлагаю использовать части от владельца транзакции (идентификатор пользователя) и части от самой транзакции и объединить их для создания уникального идентификатора транзакции. Если это невозможно, я предлагаю преобразовать GUID в десятичную. Вот как это сделать: Преобразование System.Decimal в System.Guid

1 голос
/ 12 февраля 2012

Вы можете использовать функцию идентификации в SQL Server и определить начальное значение http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80).aspx

1 голос
/ 12 февраля 2012

генерировать ... пока я не добьюсь успеха.

Хорошо. Вероятно, это даже сработало бы, если бы количество ваших транзакций оставалось относительно низким по сравнению со всеми возможностями, но это кажется действительно неправильным. Перехват исключений и повторная попытка?

Есть ли у вас причины не использовать автоинкрементный ключ, начиная с 100000000 и считая?

0 голосов
/ 12 февраля 2012

Если у вас есть веская причина для того, чтобы идентификаторы были в случайном порядке, возможно, вы могли бы написать одноразовую служебную программу на C #, чтобы сгенерировать случайный список чисел и вставить их в таблицу SQL.Затем, когда вашей программе требуется идентификатор, она может выбрать следующий доступный из этой таблицы.Конечно, вам нужно битовое поле или что-то, чтобы отметить, какие идентификаторы были использованы.Возможно, вы захотите поместить операции выбора и пометки в хранимую процедуру и сделать так, чтобы процедура блокировала таблицу, пока она работает, поэтому одновременные процессы не получают один и тот же идентификатор, пока у них не было возможности пометить его как использованный.

...