Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.31;
Скачать: CL | DM;

Вниз

Вставка записи в БД   Найти похожие ветки 

 
Skywalker ©   (2003-07-08 17:11) [0]

Такая ситуация:
Втавляю в БД запись, потом получаю ID записи слледующим
запросом, который юзает генератор
параллельно другой процесс может тоже вставить запись
в эту же таблицу в момент между моими запросами и тогда
в теории я получаю неправильный ID вставленной записи...
я правильно размышляю, если правильно, то как обойти эту ситуацию?


 
Silla ©   (2003-07-08 17:13) [1]

Наверное присваивать Айди
только после того когда отправляешь
добавленную запись, то бишь перед постом

Насколько я знаю эта проблема не нова


 
Skywalker ©   (2003-07-08 17:16) [2]

чтоб его присвоить нужно его сначала взять из базы
получается та же ситуация:
пока я его буду брать пар. процесс может вставить запись
и тогда в итоге я получу ошибку при попытке вставить неуникальный ID


 
Johnmen ©   (2003-07-08 17:20) [3]

Если ID получен с помощью генератора, то уникальность обеспечена.


 
Skywalker ©   (2003-07-08 17:21) [4]

еще есть опыт, когда-то я экспериментировал
с TDatabase и выяснил что окончательно изменения сделанные
в базе этой компонентой становятся доступны другим транзакциям при исполнении метода TDatabase.Close
в связи с этим еще одна сложность, два процесса получается могут
получить один и тот же ID при вставке записи или я не прав?
как действует СУБД в этой ситуации и как действовать мне?


 
Skywalker ©   (2003-07-08 17:26) [5]

2 Johnmen
это понятно, ты просто немного не понял вопрос, смотри
на примере процессов:
проц.1 - вставка записи ID=1
проц.2 - вставка записи ID=2
проц.1 - получение последнего значения генератора через GEN_ID
получаем значение ID=2

в итоге проц. 1 получил неверный ID для своей вставленной записи


 
Johnmen ©   (2003-07-08 17:27) [6]

Становятся "доступны" после подтверждения транзакции.
Переходи на компоненты прямого доступа (напр.IBX).


 
Johnmen ©   (2003-07-08 17:29) [7]

>Skywalker © (08.07.03 17:26)

??????????
Надеюсь значение генератора получается GEN_ID(MyGen, 1) ?


 
Silla ©   (2003-07-08 17:29) [8]

При завершении транзакции сервер дает подтверждение,
что все удачно прошло,
иначе запись не попадет в бд
и надо обрабатывать исключительную ситуацию


 
Skywalker ©   (2003-07-08 17:34) [9]

текущее значение генератора получается GEN_ID(mygen,0)

2 Silla
а как получить это сообщение от сервера?


 
Johnmen ©   (2003-07-08 17:39) [10]

>Skywalker © (08.07.03 17:34)
>текущее значение генератора получается GEN_ID(mygen,0)

Не оправдал надежды...:(

>Silla © (08.07.03 17:29)
>При завершении транзакции сервер дает подтверждение,

Ничего он никому не дает...:)
Подтверждение/откат тр-ии - дело клиента.


 
Romkin ©   (2003-07-08 17:39) [11]

Угу. Канделябра мало...
Зачем тебе тогда вообще генератор? :-)
С тем же успехом можно таблицу юзать...


 
Skywalker ©   (2003-07-08 17:55) [12]

вобщем выход я придумал такой
устанавливаем TIBQuery.CashedUpdates=true
делаем все необходимые запросы
выполняем TIBTransaction.Commit, которое одним махом заносит все изменения

что скажите господа?


 
Romkin ©   (2003-07-08 18:29) [13]

Ваша отмазка не катит. Геренатор работает вне контекста транзакции.
НУ что стоит сделать триггер вида

before insert
as
begin
if (NEW.ID_Field is NULL) then
NEW.ID_Field = GEN_ID(mygen,1);
end

Это чтобы ээээ... прикрыть то, что сзади.
В приложении сделать запрос вида select Gen_ID(mygen,1) from rdb$database
(НУ можно даже формировать строку запроса динамически с разными именами генератора)
Потом просто: у запроса на OnNewRecord или OnAfterInsert сделать энтому запросу Open, взять новое значение генератора и вставить в ID_Field.
Все! Просто и доступно, млин. Никаких коллизий, значение известно сразу, перечитывать не надо, триггер не вякнет...



Страницы: 1 вся ветка

Текущий архив: 2003.07.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
3-100570
Николай
2003-07-07 15:29
2003.07.31
Работа с DbGrid...


11-100653
Bartov
2002-11-26 20:44
2003.07.31
KOL - Делфи7 (Посмотрите все)


1-100783
explorer
2003-07-16 07:24
2003.07.31
Хранение картинок


8-100845
AlexOld
2003-04-07 11:16
2003.07.31
Выделение мышью фрагмента на Canvas


1-100828
Федор
2003-07-17 13:05
2003.07.31
в DevXpressQuantumGrid из кода выделить строку цветом