Это непростой способ, особенно если вы настаиваете на следующем доступном значении (= пробелов нет). Вы должны использовать значение автоинкремента, и это сделает ваше приложение намного лучше.
В чем проблема?
- Вам необходимо получить значение из базы данных
- Вам необходимо присвоить его вашей сущности
- Вам необходимо сохранить объект в базе данных
Выглядит просто, не так ли? Нет, если у вас есть параллельная среда, в которой более одного потока могут выполнить шаг 1. одновременно, прежде чем другие потоки достигнут шага 3. = все потоки вставят запись с одинаковым значением.
Как с этим бороться? Одним из способов является использование отдельной таблицы с максимальным значением и атомарной операцией для получения и увеличения значения. Я думаю, что хранимая процедура, выполняющая что-то вроде этого, должна быть атомарной:
DECLARE @Result INT
UPDATE SequenceTable SET @Result = MaxValue = MaxValue + 1 WHERE SequnceName = '...'
RETURN @Result
Для достижения максимальной пропускной способности вызов хранимой процедуры должен быть за пределами любой транзакции.
Надеемся, что это позволит вам генерировать уникальные числа, но не последовательность без пробелов. Если вы возьмете значение с помощью такой операции и не будете использовать это значение, оно будет потеряно, и ваша последовательность будет содержать пробел.
Если вы не хотите пропуска, вы должны поместить вызов хранимой процедуры и операцию в транзакцию, чтобы запись в таблице последовательности была заблокирована до фиксации данных.