powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблемма организации Identity
12 сообщений из 12, страница 1 из 1
Проблемма организации Identity
    #32000278
Vasily
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет,

Подскажите, как поведет себя сервер в следующем случае:

есть таблица T с полем A int;
по постановки задачи это поле должно вести себя подобно identity c шагом 1.
данное свойство поддерживается с помощью хранимой процедуры типа

declare @A int
SELECT @A = max(A)+1 from T
insert T (A) values (@A)

Что произойдет, если одновтеменно два пользователя вызовут эту
хранимую процедуру.
Не получится ли так, что я получу две одинаковые строки?

Зарание спасибо.
Василий.
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000279
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получиться. Поэтому надо писать:

declare @A int
begin tran
SELECT @A = max(A)+1 from T
insert T (A) values (@A)
commit tran


С приветом Сергей
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000280
Vasily
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Сергей.

Но тогда возникает следующий вопрос...
Какой уровень изоляции транзакции достаточно поставить?
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000281
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, я таких умный словей не знаю: уровень изоляции транзакции.
По почте напиши sergsuper@mail.ru или по Аське
Может поймем друг друга
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000282
Evgeny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, что вмешиваюсь.
Уровень изоляции нужен максимальный:
Set Transaction Isolation Level Serializable
Все остальные уровни разрешают добавление данных.
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000285
vasily
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да Евгений, я уже докопался до этого, спасибо.
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000292
Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы порекомендовал во избежания возникновения DeadLock'ов использовать следующую конструкцию:
\ndeclare @A int
begin tran
SELECT @A = max(A)+1 from T WITH (tablockx)
insert T (A) values (@A)
commit tran

при этом уровень изоляции следует выставлять по умолчанию:
\nSET TRANSACTION ISOLATION LEVEL READ COMMITTED
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000516
Phil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я обычно использую отдельную таблицу вида
Create table SIdentity (
[table] varchar(255) NOT NULL PRIMARY,
[ident] int NOT NULL
)

и при определении следующего значения
begin tran
select @i = ident from SIdentity where [table] = 'test'
update SIdentity set [ident] = [ident]+1
end trans

Здесь блокируется только одна строка в очень маленькой таблице, которая скорей всего будет в кэше.

Подобную операцию можно выделить в отдельную процедуру GET_IDENTITY и пользоваться для разных таблиц.
Очень удобно для общего генератора на несколько таблиц.
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000518
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше даже без begin tran...

update SIdentity set [ident] = [ident] + 1, @i = [ident] where [tablename] = 'test'
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000538
Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А еще лучше
update SIdentity set @i = [ident] = [ident] + 1 where [tablename] = 'test'
:)
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000542
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, лучше... Удалось уменьшить размер процедуры на 18 байт!!! Соответственно уменьшится размер файла БД!
...
Рейтинг: 0 / 0
Проблемма организации Identity
    #32000543
Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:))))
я имел в виду что порядок присваивания в команде update не определен (по моему - по крайней меня я не встречал в описаниях), поэтому если ты хочешь быть уверен, что при работе данного кода на следующих версииях результат будет выходить один и тот же, лучше использовать предложенный мной синтаксис.
Если я не прав - и кому-нибудь известна документация Microsoft утверждающая строгий порядок выполнения присваиваний в команде UPDATE (слева на право или наоборот) буду очень признателен за ссылочку
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблемма организации Identity
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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