Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SCOPE_IDENTITY() не всегда корректно выполняется [D7, MSSQL]


Страницы:   1 2

Serg2103 ©   (2006-02-01 18:11:00) 

MS SQL 2005.
Существует программа, которая добавляет в главную таблицу данные. Затем вызывает функцию SCOPE_IDENTITY(), узнает ID только что добавленной строки, затем в другую таблицу добавляет данные, уже привязанные к этому ID.
Вроде все просто и стандартно. Так вот.
Копий этой программы работает одновременно много. И соответственно добавления данных происходить могут одновременно.
Вообщем, стал замечать, что порой (не всегда) функция SCOPE_IDENITY() определяет ID не той строки, которая была добавлена в текущей программе, а какой-то другой, и, соответственно, данные начинают привязыватся не к той строке.
Я чего-то не понимаю? Ведь вроде SCOPE_IDENTITY() должно работать только в пределах текущей сессии, т.е. насколько я могу понять - в пределах текущего подключения. Почему-то это не всегда срабатывает. Подскажите, пожалуйста, в чем может юыть проблема?


Fay   (2006-02-02 09:57:00) [21]

2 Ega23 ©   (02.02.06 09:46) [7]
> А разница такая, что если несколькими запросами это делать, ...
Извините, но я пока не уловил связи между транзакциями и запросами.


Ega23   (2006-02-02 09:49:00) [22]

Я бы на твоём месте сделал всё это дело в рамках одной хранимой процедуры.


Ega23   (2006-02-02 09:46:00) [23]


> Fay ©   (02.02.06 09:26) [6]
>
> 2 Nikolay M. ©   (01.02.06 18:46) [2]
> > Надеюсь, ты это в рамках одной транзакции делаешь?
> А какая разница?
>


А разница такая, что если несколькими запросами это делать, то не факт, что SCOPE_IDENTITY будет нужный. Его может другой клиент "перехватить".


Fay   (2006-02-02 09:26:00) [24]

2 Nikolay M. ©   (01.02.06 18:46) [2]
> Надеюсь, ты это в рамках одной транзакции делаешь?
А какая разница?


sniknik   (2006-02-01 23:56:00) [25]

но на самом деле поискал бы еще варианты "узких мест" в программе. этот вариант сомнительный какойто.


sniknik   (2006-02-01 23:53:00) [26]

> Там код примерно так идет:
сделай так
Строчка нейтрального кода
Строчка нейтрального кода
Строчка нейтрального кода
Строчка нейтрального кода
ADODataSet1.CommandText:=
 'INSERT ...'#13#10+
 'SELECT SCOPE_IDENTITY() AS GUID';
ADODataSet1.Open;
GUID:= ADODataSet1.FieldByName('GUID').AsInteger;


так должно быть всегда коректно.


Serg2103   (2006-02-01 22:28:00) [27]


> Надеюсь, ты это в рамках одной транзакции делаешь? Или несколько
> запросов с клиента?


К своему стыду сообщу, что я наверно не совсем хорошо представляю суть вашего вопроса... :[ Вроде, SQL изучил, работать удавалось, а вот в теорию глубоко не вдавался... Наверное, не в рамках одной. Там код примерно так идет:

Query1.SQL.Text:='INSERT ...';
Query1.ExecSQL;
Строчка нейтрального кода
Строчка нейтрального кода
Строчка нейтрального кода
Строчка нейтрального кода
Query1.SQL.Text:='SELECT SCOPE_IDENTITY() AS GUID';
Query1.Open;
GUID:=Query1.FieldByName('GUID').AsString;

Вообщем, вот этот GUID не всегда корректно определяется. Подскажите, в чем моя ошибка?


Nikolay M.   (2006-02-01 18:46:00) [28]


> в чем может юыть проблема?


Например, в


> MS SQL 2005.


Я так и не рискнул на него переезжать до выхода первого пака.


Ega23   (2006-02-01 18:32:00) [29]


> то порой (не всегда) функция SCOPE_IDENITY() определяет
> ID не той строки, которая была добавлена в текущей программе,
>  а какой-то другой, и, соответственно, данные начинают привязыватся
> не к той строке.


Надеюсь, ты это в рамках одной транзакции делаешь? Или несколько запросов с клиента?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо