Как ПРАВИЛЬНО ловить курсор в табл. после передер. сервера?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 01 сен 2006, 12:28

Ага, давай, расскажи. А то при слове "фокус" у меня сразу металлический привкус на зубах :)

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 01 сен 2006, 13:19

Идея тут такая... как мне объяснили на собеседовании. Используем транзакцию или даже транзакции, одна в другой гуляет. Ну если все шоколадно, то Commit стало быть, но откат обязательно RollBack, он откатит и себя и все внешние транзакции и так надо делать всегда. Т.е. если мы сохраняем запись, в ней ну скажем 5 полей, на третьем поле закончилось место на жестком диске, то откат должен происходить всего, либо все сохраняем либо ничего. Внутри ну это я сама уже придумывала я использовала ApplyUpdates и курсор не скачет. А внешние ключи это в тему целостности, чтобы откат происходил. скажем есть две таблицы первая-изделие, а вторая платы, кот. входят в это изделие. Понятно что когда я добавляю плату именно в текущее изделие я должна знать, что текущее изделие никто не удалил. так вот как раз внешние ключи и сформируют исключение и транзакция откатиться. У меня до этого по-другому было написано, сейчас когда объяснили вся прога в 5 строчек! :D Вроде пашет! :D Летает! :D Ну посмотрим как оно будет.... в работе. В первый раз такое леплю, не знаю что получиться

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 01 сен 2006, 13:24

Алкоголь на женщин действует сильнее и опаснее. Хотя, может, тут и трава...

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 01 сен 2006, 13:29

No comments.
P.S. А ведь это реальные программисты (в смысле подобные Марине). Которые пишут реальные БД, на которых работают вполне реальные люди.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 сен 2006, 15:11

мда. сильно завернуто. особенно про вложенные транзакции, и нехватку диска при записи 5-ти полей...

ud
Сообщения: 9
Зарегистрирован: 01 сен 2006, 11:15

Сообщение ud » 01 сен 2006, 21:02

/me под столом

Фанис
Сообщения: 17
Зарегистрирован: 16 июн 2005, 19:28

Сообщение Фанис » 03 сен 2006, 04:18

Марина писал(а):Идея тут такая... как мне объяснили на собеседовании. Используем транзакцию или даже транзакции, одна в другой гуляет....
не знаю что получиться
Марин, мне приходится каждый день читать лекции по бюджетной бухгалтерии :-) женщинам - так вот, основной мой посыл "не пытайтесь усложнять простое". StartTransaction, select or insert or update or delete, commit or rollback. Гулять здесь негде. Похоже, что на собеседовании просто - увы, неудачно пошутили.

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 07 сен 2006, 12:57

чего-то я не поняла в чем прикол... я просто рассказала идею, как я в начале лепила и как потом все это переделала после собеседования. Я вначале все лепила, то курсор ловлю, то дедлоги убираю, а тут все в пять строчек и все работает как надо, разве это плохо? Я порадовалась, что все теперь у меня круто, не то что было.... Не знаю может много чего написала и не разборчиво. Ну конечно..... каждый может обидеть бедного художника! Ах мужчины!

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 07 сен 2006, 13:13

Всё просто - мы говорим на разных языках, причём оба называются "русский" :)

ЗЫ: Наверное, кто-то забыл уникальность индекса по языкам выставить :lol:

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 07 сен 2006, 14:01

Марина, создание БД - это не работа с пластилином... Тут не только гибкие пальчики нужны. Еще неизвестно, что там у тебя сейчас в базе творится.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 07 сен 2006, 14:35

Марина писал(а): чего-то я не поняла в чем прикол... Я вначале все лепила, то курсор ловлю, то дедлоги убираю, а тут все в пять строчек и все работает как надо, разве это плохо? Я порадовалась, что все теперь у меня круто, не то что было.... Ах мужчины!
А мона на энтот код в 5 строчек глянуть? а то любопытство жутко разбирает :)

Марина
Сообщения: 32
Зарегистрирован: 14 дек 2005, 13:08

Сообщение Марина » 10 сен 2006, 21:15

смысл где-то так, если память сейчас не изменяет ну и внешние ключи

Код: Выделить всё

Form1.IBTransaction1.Active:=false;
Form1.IBTransaction1.StartTransaction;
TRY
  Form1.IBQuery1.Post;
  Form1.IBDatabase1.ApplyUpdates([Form1.IBQuery1]);
  Form1.IBTransaction1.Commit;
EXCEPT
  Form1.IBTransaction1.Rollback;
  MessageDlg('Изменения не сохранены!', mtError, [mbOK], 0);
end
Интина где-то рядом! :shock:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 сен 2006, 21:38

Form1.IBTransaction1.Active:=false;
и сразу грабля. Т.к. такое завершение транзакции завершит ее тем, что стоит у нее в DefaultAction. По умолчанию там taRollback, но может стоять все что угодно.
Form1.IBDatabase1.ApplyUpdates([Form1.IBQuery1]);
это зачем? включены CachedUpdates? зачем???
смысл где-то так, если память сейчас не изменяет ну и внешние ключи
остальной кусок кода - совершенно типический, и описан в документации по Delphi. Стоило ли так мучиться?

ps. кроме того, в определенных случаях commit вызывается в ApplyUpdates, автоматически.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 11 сен 2006, 09:05

kdv писал(а): остальной кусок кода - совершенно типический, и описан в документации по Delphi. Стоило ли так мучиться?

Код: Выделить всё

......
EXCEPT
  dataset.Cancel; 
  Form1.IBTransaction1.Commit; 
  MessageDlg('Изменения не сохранены!', mtError, [mbOK], 0); 
end
интересно, какие грабли при подобном коде могут появиться при условии, что изменения производятся только в одной таблице?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 11 сен 2006, 09:23

какие грабли при подобном коде могут появиться при условии
если выше было обращение к селективной процедуре, которая в цикле for меняла данные, то грабли обеспечены. commit при возникновении exception можно делать только если ты на 100% уверен, что перед этим в транзакции "не выполнилась" только одна операция, или выполнились нужные.

и вообще, не путай нам тему. :) твой вопрос слишком сложен для нее. И ответ на него есть в статьях по транзакциям и ibx.

Ответить