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

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

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

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

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

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

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


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

Но тогда возникает следующий вопрос...
Какой уровень изоляции транзакции достаточно поставить?
...
Рейтинг: 0 / 0
25.09.2000, 14:00
    #32000281
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемма организации Identity
Ой, я таких умный словей не знаю: уровень изоляции транзакции.
По почте напиши sergsuper@mail.ru или по Аське
Может поймем друг друга
...
Рейтинг: 0 / 0
25.09.2000, 16:55
    #32000282
Evgeny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемма организации Identity
Извиняюсь, что вмешиваюсь.
Уровень изоляции нужен максимальный:
Set Transaction Isolation Level Serializable
Все остальные уровни разрешают добавление данных.
...
Рейтинг: 0 / 0
26.09.2000, 07:19
    #32000285
vasily
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемма организации Identity
Да Евгений, я уже докопался до этого, спасибо.
...
Рейтинг: 0 / 0
27.09.2000, 08:58
    #32000292
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемма организации Identity
Я бы порекомендовал во избежания возникновения 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
24.10.2000, 15:13
    #32000516
Phil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемма организации Identity
Я обычно использую отдельную таблицу вида
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
24.10.2000, 16:07
    #32000518
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемма организации Identity
Лучше даже без begin tran...

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


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