Дублирующиеся автоматические номера, сгенерированные в SQL Server - PullRequest
0 голосов
/ 24 февраля 2012

Будьте осторожны, я новичок в SQL. У меня есть таблица с именем autonumber_settings, как это:

Prefix | AutoNumber
SO     | 112320
CA     | 3542

A при создании новой строки продаж вызывается хранимая процедура, которая считывает текущее значение автонумерации из строки «SO», затем увеличивает число, обновляет эту же строку и возвращает номер обратно из хранимой процедуры. Хранимая процедура ниже:

ALTER PROCEDURE [dbo].[GetAutoNumber]
(
    @type nvarchar(50) ,
    @out nvarchar(50) = '' OUTPUT
)
as
set nocount on

declare @currentvalue nvarchar(50)
declare @prefix nvarchar(10)

if exists (select * from autonumber_settings where lower(autonumber_type) = lower(@type))
begin
    select @prefix = isnull(autonumber_prefix,''),@currentvalue=autonumber_currentvalue 
    from autonumber_settings
    where lower(autonumber_type) = lower(@type)

    set @currentvalue = @currentvalue + 1

    update dbo.autonumber_settings set autonumber_currentvalue = @currentvalue where lower(autonumber_type) = lower(@type)
    set @out = cast(@prefix as nvarchar(10)) + cast(@currentvalue as nvarchar(50))
    select @out as value
end
else
    select '' as value

Теперь есть еще одна процедура, которая обращается к той же таблице, которая дублирует заказы, копируя как заголовок, так и строки. Иногда дублирование приводит к дублированию номеров строк. Вот часть этой процедуры:

BEGIN TRAN

IF exists
(
       SELECT *
       FROM autonumber_settings
       WHERE autonumber_type = 'SalesOrderDetail'
)
BEGIN
       SELECT
                @prefix = ISNULL(autonumber_prefix,'')
               ,@current_value=CAST (autonumber_currentvalue AS INTEGER)
       FROM autonumber_settings
       WHERE autonumber_type = 'SalesOrderDetail'

       SET @new_auto_number = @current_value + @number_of_lines

       UPDATE dbo.autonumber_settings
       SET autonumber_currentvalue = @new_auto_number
       WHERE autonumber_type = 'SalesOrderDetail'
END
COMMIT TRAN

Любые идеи о том, почему эти две процедуры, кажется, не сочетаются друг с другом, иногда давая одинаковые номера строк, созданные с нуля, как строки, созданные дублированием.

Ответы [ 2 ]

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

Вы можете использовать повторяемое чтение на выбор.Это заблокирует строку и заблокирует выбор другой процедуры, пока вы не обновите значение и не подтвердите.

Вставьте WITH (REPEATABLEREAD, ROWLOCK) после предложения from для каждого выбора.

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

Это условие гонки или ваше задание по номеру.Два выполнения могут считывать одно и то же значение до того, как новое будет записано обратно в базу данных.

Лучший способ исправить это - использовать столбец идентификаторов и позволить серверу SQL обрабатывать назначения автономного номера.

Запрет на использование sp_getapplock для сериализации доступа к autonumber_settings.

...