Как ПРАВИЛЬНО ловить курсор в табл. после передер. сервера?
Идея тут такая... как мне объяснили на собеседовании. Используем транзакцию или даже транзакции, одна в другой гуляет. Ну если все шоколадно, то Commit стало быть, но откат обязательно RollBack, он откатит и себя и все внешние транзакции и так надо делать всегда. Т.е. если мы сохраняем запись, в ней ну скажем 5 полей, на третьем поле закончилось место на жестком диске, то откат должен происходить всего, либо все сохраняем либо ничего. Внутри ну это я сама уже придумывала я использовала ApplyUpdates и курсор не скачет. А внешние ключи это в тему целостности, чтобы откат происходил. скажем есть две таблицы первая-изделие, а вторая платы, кот. входят в это изделие. Понятно что когда я добавляю плату именно в текущее изделие я должна знать, что текущее изделие никто не удалил. так вот как раз внешние ключи и сформируют исключение и транзакция откатиться. У меня до этого по-другому было написано, сейчас когда объяснили вся прога в 5 строчек! Вроде пашет! Летает! Ну посмотрим как оно будет.... в работе. В первый раз такое леплю, не знаю что получиться
Марин, мне приходится каждый день читать лекции по бюджетной бухгалтерии женщинам - так вот, основной мой посыл "не пытайтесь усложнять простое". StartTransaction, select or insert or update or delete, commit or rollback. Гулять здесь негде. Похоже, что на собеседовании просто - увы, неудачно пошутили.Марина писал(а):Идея тут такая... как мне объяснили на собеседовании. Используем транзакцию или даже транзакции, одна в другой гуляет....
не знаю что получиться
чего-то я не поняла в чем прикол... я просто рассказала идею, как я в начале лепила и как потом все это переделала после собеседования. Я вначале все лепила, то курсор ловлю, то дедлоги убираю, а тут все в пять строчек и все работает как надо, разве это плохо? Я порадовалась, что все теперь у меня круто, не то что было.... Не знаю может много чего написала и не разборчиво. Ну конечно..... каждый может обидеть бедного художника! Ах мужчины!
А мона на энтот код в 5 строчек глянуть? а то любопытство жутко разбираетМарина писал(а): чего-то я не поняла в чем прикол... Я вначале все лепила, то курсор ловлю, то дедлоги убираю, а тут все в пять строчек и все работает как надо, разве это плохо? Я порадовалась, что все теперь у меня круто, не то что было.... Ах мужчины!
смысл где-то так, если память сейчас не изменяет ну и внешние ключи
Интина где-то рядом!
Код: Выделить всё
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
и сразу грабля. Т.к. такое завершение транзакции завершит ее тем, что стоит у нее в DefaultAction. По умолчанию там taRollback, но может стоять все что угодно.Form1.IBTransaction1.Active:=false;
это зачем? включены CachedUpdates? зачем???Form1.IBDatabase1.ApplyUpdates([Form1.IBQuery1]);
остальной кусок кода - совершенно типический, и описан в документации по Delphi. Стоило ли так мучиться?смысл где-то так, если память сейчас не изменяет ну и внешние ключи
ps. кроме того, в определенных случаях commit вызывается в ApplyUpdates, автоматически.
kdv писал(а): остальной кусок кода - совершенно типический, и описан в документации по Delphi. Стоило ли так мучиться?
Код: Выделить всё
......
EXCEPT
dataset.Cancel;
Form1.IBTransaction1.Commit;
MessageDlg('Изменения не сохранены!', mtError, [mbOK], 0);
end
если выше было обращение к селективной процедуре, которая в цикле for меняла данные, то грабли обеспечены. commit при возникновении exception можно делать только если ты на 100% уверен, что перед этим в транзакции "не выполнилась" только одна операция, или выполнились нужные.какие грабли при подобном коде могут появиться при условии
и вообще, не путай нам тему. твой вопрос слишком сложен для нее. И ответ на него есть в статьях по транзакциям и ibx.