Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-100965
Opera
2003-07-15 12:08
2003.07.31
GameExplorer


3-100609
captive
2003-07-09 17:44
2003.07.31
Обработка событий InterBase


1-100707
Митяй2
2003-07-16 06:47
2003.07.31
OpenDialog для выбора папки


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


1-100675
АлеКо
2003-07-16 04:20
2003.07.31
Запуск DOS приложения под Win2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский