Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему Commit не отсылает данные на сервер? [D5, IB6.x]


Страницы:   1 2

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]
??

вставка записи сама по себе для тебя слишком простая операция, чтобы использовать для ее выполнения хп,
или у тебя есть градация сложности вставки (кол-во значений, полей, таблиц),
или ты в любом случае предпочитаешь прямое присваивание значений, как в примере?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо