Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужна помощь (дублирование при вставке)  [new]
mattK
Member

Откуда:
Сообщений: 8
Прошу помощи

Есть таблица с документами.Структура упрощена.

CREATE TABLE [dbo].[Documents](
	[Id] [int] IDENTITY(1,1) NOT NULL primary key,
	[Number] [varchar](50) NOT NULL,
        .........)


Есть процедура вставки документа.
CREATE PROCEDURE [dbo].[Document_Insert]
  @DateTime  DateTime,
  @NewNumber VarChar(50) = NULL OUT 
AS
begin 
set transaction isolation level repeatable read
begin tran
declare @Number nvarchar(50)
declare @NumDoc int
declare @LastNum varchar(50)

Set @LastNum =(Select Number from TestDocs  where Id=(Select MAX(ID) f0 from TestDocs)
/*Дополнительная обработка*/
If (@LastNum is null)
begin
Set @NumDoc = 0
end 
else
begin
Set @NumDoc=CAST(SUBSTRING(@LastNum,12,Len(@LastNum)) as int)+1
end
Set @Number =CONVERT(varchar(10),getdate(),112) + '/' + CAST(@NumDoc as varchar(9))
insert into TestDocs values(@DateTime,@Number)

if @@ERROR=0 
Begin 
	Commit Tran
End 
else
begin 
	rollback tran
end

end



Номер генерируется по бизнес правилам. Номера должны идти последовательно. Фрагментацию из-за удаления документов не рассматриваем.
Не всегда, но периодически происходит задвоение номера документа.....
Подскажите, в какую сторону копать. Нужно на время генерации текущей транзакцией номера документа закрыть возможность генерить номер документа другим транзакциям..... Как правильно это сделать.
15 май 16, 18:07    [19175921]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь (дублирование при вставке)  [new]
mattK
Member

Откуда:
Сообщений: 8
mattK,

Поясню про дублирование: две разные сессии могут занести один и тот же номер документа
15 май 16, 18:11    [19175933]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь (дублирование при вставке)  [new]
Rankatan
Member

Откуда:
Сообщений: 250
mattK
mattK,

Поясню про дублирование: две разные сессии могут занести один и тот же номер документа

в Set @LastNum =(Select Number from TestDocs where Id=(Select MAX(ID) f0 from TestDocs)
замени TestDocs на TestDocs WITH(UPDLOCK)
и передалай REPEATABLE READ в SERIALIZABLE

это точно решит проблему.
15 май 16, 19:12    [19176132]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь (дублирование при вставке)  [new]
mattK
Member

Откуда:
Сообщений: 8
Rankatan,

Спасибо.

Я поставил (XLOCK) и SERIALIZABLE
Намного это ухудшит производительность?

Еще вопрос:есть ли какая литература, почитать про данные хинты более в человечном виде чем MSDN. Чтобы примеры были и описание комбинации параметров. А то все по методу граблей.......
15 май 16, 21:05    [19176507]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь (дублирование при вставке)  [new]
Rankatan
Member

Откуда:
Сообщений: 250
mattK
Rankatan,

Спасибо.

Я поставил (XLOCK) и SERIALIZABLE
Намного это ухудшит производительность?

Намного, поставь UPDLOCK
15 май 16, 22:02    [19176697]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь (дублирование при вставке)  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
mattK
Намного это ухудшит производительность?
Если речь идет о писателях, то все конкурирующие сессии, вставляющие строки или модифицирующие строку с максимальным ID, выстроятся в очередь. Будет ли при этом использован xlock или updlock - не важно.
Если речь идет о читателях (обычных, которые накладывают S при чтении), то все конкурирующие сессии смогут читать таблицу, кроме строки с максимальным ID при использовании xlock. При updlock смогут читать и эту строку.
Так что, если много конкурирующих вставок, то производительность именно вставок просядет.
mattK
Еще вопрос:есть ли какая литература, почитать про данные хинты
SQL Server Concurrency: Locking, Blocking and Row Versioning
15 май 16, 22:33    [19176780]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь (дублирование при вставке)  [new]
mattK
Member

Откуда:
Сообщений: 8
Rankatan,

Спасибо
16 май 16, 06:17    [19177130]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь (дублирование при вставке)  [new]
mattK
Member

Откуда:
Сообщений: 8
invm,

Спасибо за ссылку, почитаем.....
16 май 16, 06:18    [19177131]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить