Форум: "Базы";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
ВнизВставка записи в БД Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c