![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему Commit не отсылает данные на сервер? [D5, IB6.x]
Hawk2 © (2004-03-31 10:55:00)Помогите разобраться с проблемой!
Значит работаю с InterBase6, клиента творю в Delphi5+SP1+UpdateIBX5.04, при вставке записи в таблицу, эта запись появляется в Гриде, но ее не видно на сервере и соответственно другой клиент или другая транзакция в этой же программе не видят этой добавленой записи. Все изменения добавляются только после того как я закрою свою программу, тоесть когда IBDataBase.Connected:=false;
Использую IBDataSet, CachedUpdate=false, вставку делаю так:
try
DM.IBTransaction7.StartTransaction;
DM.Oborot.Insert;
...
DM.Oborot.FieldByName('PROVREC_ID').AsInteger:=Prov_ID;
DM.Oborot.FieldByName('RAMOUNT').AsFloat:=cedtAmount1.Value;
...
DM.Oborot.Post;
DM.IBTransaction7.Commit;
except
DM.IBTransaction7.Rollback;
raise;
end;
Курдль (2004-03-31 16:08:00) [1]
> А что insert лучше делать при закрытой транзакции? :)
> Держать открытыми транзакции вредно? Тогда зачем они вообще?
1. "Голова человеку дадена не токмо шапку носить!" (с)
А пошто программисту даден механизЬм кэшированных изменений?
Именно затем, чтобы юзер добавлял, изменял, удалял записи до изнеможения, а по желанию - утверждал все свои изменения в БД или забивал на них.
Именно этот метод, а не commit/rollback является боле простым и надежным.
2. Держать открытыми транзакции можно лишь в том случае, если, как я уже говорил, ожидаются "ручные откаты".
Например. Юзер создает сложных документ (типа плана-графика).
Открывается транзакция. Потом он делает изменения во множестве таблиц (которые он тут же видит, но не другие юзеры), задействует при этом массу серверныхресурсов (процедур, ф-ций, триггеров), оценяет все плоды свои в рилтайме и, разочаровавшись, решает все отменить. Вот тогда-то и применяется откат в рамках всей транзакции.
Зачем это применять для единичных изменений в единичной таблице?
Hawk2 (2004-03-31 14:46:00) [2]Курдль © (31.03.04 13:13) [33]
>держите открытую транзакцию во время insert и всего, что с ним связано (а в таких базах, как IB это чревато).
А что insert лучше делать при закрытой транзакции? :)
Держать открытыми транзакции вредно? Тогда зачем они вообще?
Курдль (2004-03-31 13:33:00) [3]
> Vemer © (31.03.04 13:31) [34]
> ApplyUpdates к транзакциям вообще отношения не имеет.
:(
Vemer (2004-03-31 13:31:00) [4]ApplyUpdates к транзакциям вообще отношения не имеет.
Курдль (2004-03-31 13:13:00) [5]
> А какая разница, цель то одна
А средства? Вы подменяете "исправную автоматику" конструкции IBDataBase.ApplyUpdates, да еще держите открытую транзакцию во время insert и всего, что с ним связано (а в таких базах, как IB это чревато).
Hawk2 (2004-03-31 13:12:00) [6]Курдль © (31.03.04 12:58) [30]
>(типа юзер долго и нудно набрасывал эскиз, а потом от него >отказался), то и нефиг открывать транзакции вручную! :)
С одной стороны правильно, но с другой нефиг этому юзеру сидеть и размышлять, отправлять ему данные или нет! Все будет вводиться из документа, с карточки, а если и проскочет ошибка, то для этого есть возможность коректировки введенных записей! :)
Hawk2 (2004-03-31 13:06:00) [7]Курдль © (31.03.04 12:50) [27]
А какая разница, цель то одна, нужно обязательно видеть добавленные или измененные записи, причем сразу же! В Гриде который подключен к редактируемому НД все и так отлично отображалось, но данные на сервер не отправлялись и когда в другом окне, в другом IBDataSet-е я открывал этуже таблицу, то я получал данные без этих самых записей (которые были вставлены).
Курдль (2004-03-31 12:58:00) [8]
> Что значит не оправдано? Все через транзакции - даже ApplyUpdates
> :)
Вот и я о том, что ApplyUpdates вызывает, обрабатывает, откатывает транзакции в случае ошибки!
Если в программе нет необходимости в "ручных откатах" (типа юзер долго и нудно набрасывал эскиз, а потом от него отказался), то и нефиг открывать транзакции вручную! :)
Hawk2 (2004-03-31 12:57:00) [9]УРААА!!! В контексте одной транзакции вроде все работает отлично!
ВСЕМ СПАСИБО!!!
Соловьев (2004-03-31 12:54:00) [10]
> Курдль © (31.03.04 12:50) [27]
Что значит не оправдано? Все через транзакции - даже ApplyUpdates :)
Курдль (2004-03-31 12:50:00) [11]Если честно, на мой взгляд использование транзакций в данном примере вообще не оправдано!
Вполне достаточно IBDataBase.ApplyUpdates(...)
Johnmen (2004-03-31 12:44:00) [12]>stud © (31.03.04 12:14) [23]
>одну на селект, рефреш
>и одну на изменение.
Как это реализовать ? В случае IBX и редактируемого НД.
:)
>Vemer © (31.03.04 12:35) [25]
Ведь автор работает с редактируемым НД.
А транзакций м.б. и несколько, естественно...:)
Vemer (2004-03-31 12:35:00) [13]To Johnmen>
Со всем уважением, но с в IBX можно легко организовать работу с несколькими транзакциями, правда с нек. небольшими ограничениями. Минимум 3 механизма применяю. Притом пишущая - "выстрелами" работает, читающая Read_Commited ес-но.
Кщд (2004-03-31 12:17:00) [14]Соловьев © (31.03.04 11:30) [10] всё ясно
если нет, то из приведенного Вами кода(и последующих Ваших же пояснений) следует, что Oborot работает в контексте IBTransaction6 - её и коммитьте, причем - в случае CommitRetaining - НД останется открытым.
stud (2004-03-31 12:14:00) [15]
> Johnmen © (31.03.04 12:10) [21]
почему одна?
одну на селект, рефреш
и одну на изменение.
для записи/обновления использовать например ibsql
stud (2004-03-31 12:11:00) [16]проще делать
DM.Oborot.Transaction.starttrnsactiion
....
DM.Oborot.Transaction.commit
возможно придется поменять уровень изоляции
Johnmen (2004-03-31 12:10:00) [17]>Hawk2 © (31.03.04 12:04) [20]
Если IBX, то путь один - одна тр-ия, в рамках которой и происходит работа, и селект и апдейт и т.д. После изменения данных, после поста, CommitRetaining.
Hawk2 (2004-03-31 12:04:00) [18]Кщд (31.03.04 11:57) [19]
И в чем же моя ошибка? Объясните мне пожалуйста, в каком порядке нужно все сделать чтобы было правильно?
Кщд (2004-03-31 11:57:00) [19]myor © (31.03.04 11:49) [18]
предпочитаю не ездить на танке за булочками и давать ответ согласно контексту вопроса.
Вам видна ошибка автора?
myor (2004-03-31 11:49:00) [20]Кщд (31.03.04 11:32) [13]
??
вставка записи сама по себе для тебя слишком простая операция, чтобы использовать для ее выполнения хп,
или у тебя есть градация сложности вставки (кол-во значений, полей, таблиц),
или ты в любом случае предпочитаешь прямое присваивание значений, как в примере?