Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Искусственная уникальность в MSSQL. / 7 сообщений из 7, страница 1 из 1
10.09.2002, 18:54:03
    #32049534
Александр Спелицин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Искусственная уникальность в MSSQL.
Здравствуйте.
Ситуация с искусственной уникальностью в 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
10.09.2002, 18:58:53
    #32049536
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Искусственная уникальность в MSSQL.
Может с утра?
...
Рейтинг: 0 / 0
10.09.2002, 19:55:27
    #32049549
snake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Искусственная уникальность в MSSQL.
Да , я думаю с утра, а то пива много!!!
...
Рейтинг: 0 / 0
10.09.2002, 20:07:46
    #32049550
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Искусственная уникальность в MSSQL.
В селекте скажи WITH(HOLDLOCK,UPDLOCK).
...
Рейтинг: 0 / 0
10.09.2002, 22:12:18
    #32049565
Сергей Тихонов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Искусственная уникальность в MSSQL.
Вам нужно использовать собственный механизм генераторов. Его реализовать совсем не сложно. Одна таблица, пара процедур. Смысл в том, что значение ключа получается из процедуры, которая автоматом увеличивает значение на 1...

Удачи.
...
Рейтинг: 0 / 0
11.09.2002, 08:48:28
    #32049573
snake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Искусственная уникальность в MSSQL.
Дополню, Сергей Тихонов
Запрос
Код: 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
11.09.2002, 10:55:21
    #32049599
Breakneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Искусственная уникальность в MSSQL.
Советую посмотреть здесь:\r
/topic/12200\r
Процедура и таблица, где хранятся счетчики - самый лучший вариант. Уникальность реализуется целиком и полностью (идет полная блокировка записи с максимальным номером, весь механизм генерации номеров завязан на одну процедуру и одну таблицу).
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Искусственная уникальность в MSSQL. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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