![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SCOPE_IDENTITY() не всегда корректно выполняется [D7, MSSQL]
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 не той строки, которая была добавлена в текущей программе,
> а какой-то другой, и, соответственно, данные начинают привязыватся
> не к той строке.
Надеюсь, ты это в рамках одной транзакции делаешь? Или несколько запросов с клиента?