Требование
Мне нужен способ генерировать новый уникальный номер (номер счета-фактуры) в непрерывной последовательности (при создании нового номера не следует пропускать номер)
Допустимый пример : 1, 2, 3, 4
Неверный пример : 1, 2, 4, 3 (не в непрерывной последовательности)
Схема тока
Вот моя существующая схема таблицы в таблице Тест
Решение, которое я придумала
После выполненияВ некоторых исследованиях я придумал приведенный ниже код, который, кажется, работает на данный момент.
DECLARE @i as int=0
While(@i<=10000 * 10000)
BEGIN
Begin Transaction
Insert Into Test(UniqueNo,[Text])values((Select IsNull(MAX(UniqueNo),0)+1 from Test with (TABLOCK)),'a')
COMMIT
SET @i = @i + 1;
END
Тестирование
Я попытался запустить код из 12 различных запросов SQL или 12 потоков, которые вы можете сказатьи в настоящее время он генерирует новое и уникальное значение для каждой записи, даже после вставки 162 921 строк
Основной вопрос
Может ли приведенный выше код привести к дублированию значений?
Я попробовал его методом проб и ошибок, и он отлично работает НО когда я углубляюсь в блокировка транзакции оператор выбора генерирует Shared Lock для всей таблицы, что означает, что он позволит одновременным транзакциям получить доступ кодни и те же данные, верно?
Это означает, что несколько транзакций могут генерировать повторяющиеся значения, верно?
Тогда как же я не могу увидеть какие-либо дублирующиеся значения?
РЕДАКТИРОВАТЬ
Согласно комментарию Дэвида
Я не могу использовать поле идентификатора, потому что в любом случае, если я удалю запись, мне будет сложно заполнить это число.