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