Главная страница
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.021 c
1-100742
alfim
2003-07-16 08:28
2003.07.31
Excel.Application.8, его свойства и методы...


3-100584
Григорий Ситнин
2003-06-26 16:39
2003.07.31
Трехзвенная архитектура приложения


14-100940
Dmitriy O.
2003-07-15 11:49
2003.07.31
Как закрыть базы данных


3-100564
jack128
2003-07-08 12:47
2003.07.31
computed by - поля


1-100825
афвуд
2003-07-16 18:51
2003.07.31
Хочу чтобы TImage был выше всех на форме.