Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
25.09.2000, 12:51
|
|||
---|---|---|---|
|
|||
Проблемма организации Identity |
|||
#18+
Привет, Подскажите, как поведет себя сервер в следующем случае: есть таблица T с полем A int; по постановки задачи это поле должно вести себя подобно identity c шагом 1. данное свойство поддерживается с помощью хранимой процедуры типа declare @A int SELECT @A = max(A)+1 from T insert T (A) values (@A) Что произойдет, если одновтеменно два пользователя вызовут эту хранимую процедуру. Не получится ли так, что я получу две одинаковые строки? Зарание спасибо. Василий. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.09.2000, 13:18
|
|||
---|---|---|---|
Проблемма организации Identity |
|||
#18+
Получиться. Поэтому надо писать: declare @A int begin tran SELECT @A = max(A)+1 from T insert T (A) values (@A) commit tran С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.09.2000, 13:48
|
|||
---|---|---|---|
|
|||
Проблемма организации Identity |
|||
#18+
Спасибо, Сергей. Но тогда возникает следующий вопрос... Какой уровень изоляции транзакции достаточно поставить? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.09.2000, 14:00
|
|||
---|---|---|---|
Проблемма организации Identity |
|||
#18+
Ой, я таких умный словей не знаю: уровень изоляции транзакции. По почте напиши sergsuper@mail.ru или по Аське Может поймем друг друга ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.09.2000, 16:55
|
|||
---|---|---|---|
|
|||
Проблемма организации Identity |
|||
#18+
Извиняюсь, что вмешиваюсь. Уровень изоляции нужен максимальный: Set Transaction Isolation Level Serializable Все остальные уровни разрешают добавление данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.09.2000, 07:19
|
|||
---|---|---|---|
|
|||
Проблемма организации Identity |
|||
#18+
Да Евгений, я уже докопался до этого, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.09.2000, 08:58
|
|||
---|---|---|---|
|
|||
Проблемма организации Identity |
|||
#18+
Я бы порекомендовал во избежания возникновения 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.10.2000, 15:13
|
|||
---|---|---|---|
|
|||
Проблемма организации Identity |
|||
#18+
Я обычно использую отдельную таблицу вида 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 и пользоваться для разных таблиц. Очень удобно для общего генератора на несколько таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.10.2000, 16:07
|
|||
---|---|---|---|
Проблемма организации Identity |
|||
#18+
Лучше даже без begin tran... update SIdentity set [ident] = [ident] + 1, @i = [ident] where [tablename] = 'test' ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.10.2000, 15:22
|
|||
---|---|---|---|
|
|||
Проблемма организации Identity |
|||
#18+
А еще лучше update SIdentity set @i = [ident] = [ident] + 1 where [tablename] = 'test' :) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.10.2000, 08:20
|
|||
---|---|---|---|
Проблемма организации Identity |
|||
#18+
Действительно, лучше... Удалось уменьшить размер процедуры на 18 байт!!! Соответственно уменьшится размер файла БД! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.10.2000, 09:10
|
|||
---|---|---|---|
|
|||
Проблемма организации Identity |
|||
#18+
:)))) я имел в виду что порядок присваивания в команде update не определен (по моему - по крайней меня я не встречал в описаниях), поэтому если ты хочешь быть уверен, что при работе данного кода на следующих версииях результат будет выходить один и тот же, лучше использовать предложенный мной синтаксис. Если я не прав - и кому-нибудь известна документация Microsoft утверждающая строгий порядок выполнения присваиваний в команде UPDATE (слева на право или наоборот) буду очень признателен за ссылочку ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=46&tablet=1&tid=1827658]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
169ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 280ms |
0 / 0 |