powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Искусственная уникальность в MSSQL.
7 сообщений из 7, страница 1 из 1
Искусственная уникальность в MSSQL.
    #32049534
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Ситуация с искусственной уникальностью в MSSQL.
Есть таблица: document (doc_id int identity, doc_type int, doc_number int, department_id int, year int, ...).
Номер документа (doc_number) должен быть уникален в пределах заданного отдела (department_id), данного типа (doc_type) и указанного года. Механизм - автоинкремент: максимум + 1.
Т.е. добавление нового документа происходит так:

create procdure CreateFirstTypeDocument @department_id int, @year int, ... какие-то параметры...
as
begin
Declare @doc_nb int
Begin Transaction

-- Точка A

Select @doc_nb = max (doc_number) + 1
From document
Where department_id = @department_id
and year = @year
and doc_type = 1
if @doc_nb Is Null
Select @doc_nb = 1

-- Точка B

Insert document (doc_type, doc_number, department_id, year, ...)
Values (1, @doc_nb, @department_id, @year, ...)

-- Точка C

...
Commit Transaction
end

В таблице одна запись, у которой doc_number = 1. Сервер сильно загружен. Процедуры выполняются медленно.
Теперь из двух сессий одновременно вызывается CreateFirstTypeDocument.
В точке B у для каждой сессии значение @doc_nb будет равно 2. Первая сессия добавляет запись нормально, а вторая своей вставкой нарушает уникальность номеров.

Как обеспечить уникальность?

Заранее спасибо.
...
Рейтинг: 0 / 0
Искусственная уникальность в MSSQL.
    #32049536
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может с утра?
...
Рейтинг: 0 / 0
Искусственная уникальность в MSSQL.
    #32049549
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да , я думаю с утра, а то пива много!!!
...
Рейтинг: 0 / 0
Искусственная уникальность в MSSQL.
    #32049550
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В селекте скажи WITH(HOLDLOCK,UPDLOCK).
...
Рейтинг: 0 / 0
Искусственная уникальность в MSSQL.
    #32049565
Фотография Сергей Тихонов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам нужно использовать собственный механизм генераторов. Его реализовать совсем не сложно. Одна таблица, пара процедур. Смысл в том, что значение ключа получается из процедуры, которая автоматом увеличивает значение на 1...

Удачи.
...
Рейтинг: 0 / 0
Искусственная уникальность в MSSQL.
    #32049573
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополню, Сергей Тихонов
Запрос
Код: plaintext
1.
2.
3.
4.
5.
Select @doc_nb = max (doc_number) +  1  
From document 
Where department_id = @department_id 
and year = @year 
and doc_type =  1  

будет не к таблице document, а к аблице содержащей значение,последнее вставленное в document. Следующий вызов процедуры увеличит его на единицу и т.д.
фрагмент кода нашей процедуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
update counters 
set @result = nomer = nomer +  1 
where namebook =	@namebook and
book = @book and
filial = @filial and
god = @god
if @result =  0 
   select @result =	-  1 
COMMIT TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
...

@result обьявлен как output параметр
...
Рейтинг: 0 / 0
Искусственная уникальность в MSSQL.
    #32049599
Breakneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Советую посмотреть здесь:\r
/topic/12200\r
Процедура и таблица, где хранятся счетчики - самый лучший вариант. Уникальность реализуется целиком и полностью (идет полная блокировка записи с максимальным номером, весь механизм генерации номеров завязан на одну процедуру и одну таблицу).
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Искусственная уникальность в MSSQL.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]