Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
ВнизПочему Commit не отсылает данные на сервер? Найти похожие ветки
← →
Hawk2 © (2004-03-31 10:55) [0]Помогите разобраться с проблемой!
Значит работаю с 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 11:05) [1]Какой уровень изоляции транзакции? Дабл клик по IBTransaction
← →
Hawk2 © (2004-03-31 11:12) [2]Да точно, думаю о чём я забыл еще написать - об изоляции!
Вобщем что я только туда не писал, сейчас стоит:
nowait
read_committed
rec_version
← →
Draught © (2004-03-31 11:13) [3]поидее в конце каждой транзакции должен быть либо коммит либо роллбэк. До тех пор пока не сделан коммит или роллбэк никто кроме самого создателя транзакции не видит этих изменений. А во время выхода у тебя автоматом проходит коммит.
пишешь:
старт транзак
запросы
соммит или роллбэк
← →
Hawk2 © (2004-03-31 11:18) [4]Draught © (31.03.04 11:13) [3]
Извените, может синим цветом плохо видно, в вопросе приведен код вставки:
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 11:20) [5]DM.Oborot.Transaction - ?
← →
Hawk2 © (2004-03-31 11:24) [6]Соловьев © (31.03.04 11:20) [5]
>DM.Oborot.Transaction - ?
В этом свойстве прописана другая транзакция IBTransaction6, она не явно стартует при открытии таблицы DM.Oborot.Open; А потом при открытой таблице я явно стартую IBTransaction7 и делаю вставку, что нужно закрывать таблицу перед вставкой?
← →
Кщд (2004-03-31 11:26) [7]Hawk2 © (31.03.04 11:24) [6]
почему считаете, что IBTransaction7 видит изменения незакомиченной IBTransaction6?
← →
myor © (2004-03-31 11:27) [8]читай [1] и разбирайся.
а ты не хочешь попробовать использовать хп?
← →
Кщд (2004-03-31 11:29) [9]точнее - неясно, что вы коммитите 7, если Ваш Oborot работает в контексте 6?
← →
Соловьев © (2004-03-31 11:30) [10]Забудь про Transaction7. или после Transaction6.Commit делай по новой открытие НД, или делай IBTransaction6.CommitRetaining или переходи на FIBPlus - там можно для одного НД указать две транзакции - одну читающую, одну пишушую.
← →
Draught © (2004-03-31 11:30) [11]Hawk2, она не явно стартует, но не факт, что она так же неявно коммитится...
← →
Draught © (2004-03-31 11:31) [12]собственно пока я читал и обдумывал уже все ответили...
← →
Кщд (2004-03-31 11:32) [13]myor © (31.03.04 11:27) [8]
хп на простую вставку записей?
← →
Hawk2 © (2004-03-31 11:32) [14]Кщд (31.03.04 11:26) [7]
IBTransaction6 - стартует при простом открытии таблицы, и ничего не меняет, чего там подтверждать? :)
myor © (31.03.04 11:27) [8]
>а ты не хочешь попробовать использовать хп?
Еще не пробовал, но должно ж оно по идее работать и так, без ХП?
← →
Hawk2 © (2004-03-31 11:36) [15]Соловьев © (31.03.04 11:30) [10]
Шестая транзакция ничего не пишет!!! Как я понял из Ваших слов вставку нужно делать при закрытой таблице и использовать одну и ту же транзакцию что на открытие, что на вставку, что на обновление?
← →
Кщд (2004-03-31 11:42) [16]Hawk2 © (31.03.04 11:32) [14]
>IBTransaction6 - стартует при простом открытии таблицы, и ничего не меняет, чего там подтверждать? :)
это разводка?
← →
Соловьев © (2004-03-31 11:45) [17]2 Hawk2 © (31.03.04 11:36) [15]
Не надо ничего закрывать.
← →
myor © (2004-03-31 11:49) [18]Кщд (31.03.04 11:32) [13]
??
вставка записи сама по себе для тебя слишком простая операция, чтобы использовать для ее выполнения хп,
или у тебя есть градация сложности вставки (кол-во значений, полей, таблиц),
или ты в любом случае предпочитаешь прямое присваивание значений, как в примере?
← →
Кщд (2004-03-31 11:57) [19]myor © (31.03.04 11:49) [18]
предпочитаю не ездить на танке за булочками и давать ответ согласно контексту вопроса.
Вам видна ошибка автора?
← →
Hawk2 © (2004-03-31 12:04) [20]Кщд (31.03.04 11:57) [19]
И в чем же моя ошибка? Объясните мне пожалуйста, в каком порядке нужно все сделать чтобы было правильно?
← →
Johnmen © (2004-03-31 12:10) [21]>Hawk2 © (31.03.04 12:04) [20]
Если IBX, то путь один - одна тр-ия, в рамках которой и происходит работа, и селект и апдейт и т.д. После изменения данных, после поста, CommitRetaining.
← →
stud © (2004-03-31 12:11) [22]проще делать
DM.Oborot.Transaction.starttrnsactiion
....
DM.Oborot.Transaction.commit
возможно придется поменять уровень изоляции
← →
stud © (2004-03-31 12:14) [23]
> Johnmen © (31.03.04 12:10) [21]
почему одна?
одну на селект, рефреш
и одну на изменение.
для записи/обновления использовать например ibsql
← →
Кщд (2004-03-31 12:17) [24]Соловьев © (31.03.04 11:30) [10] всё ясно
если нет, то из приведенного Вами кода(и последующих Ваших же пояснений) следует, что Oborot работает в контексте IBTransaction6 - её и коммитьте, причем - в случае CommitRetaining - НД останется открытым.
← →
Vemer © (2004-03-31 12:35) [25]To Johnmen>
Со всем уважением, но с в IBX можно легко организовать работу с несколькими транзакциями, правда с нек. небольшими ограничениями. Минимум 3 механизма применяю. Притом пишущая - "выстрелами" работает, читающая Read_Commited ес-но.
← →
Johnmen © (2004-03-31 12:44) [26]>stud © (31.03.04 12:14) [23]
>одну на селект, рефреш
>и одну на изменение.
Как это реализовать ? В случае IBX и редактируемого НД.
:)
>Vemer © (31.03.04 12:35) [25]
Ведь автор работает с редактируемым НД.
А транзакций м.б. и несколько, естественно...:)
← →
Курдль © (2004-03-31 12:50) [27]Если честно, на мой взгляд использование транзакций в данном примере вообще не оправдано!
Вполне достаточно IBDataBase.ApplyUpdates(...)
← →
Соловьев © (2004-03-31 12:54) [28]
> Курдль © (31.03.04 12:50) [27]
Что значит не оправдано? Все через транзакции - даже ApplyUpdates :)
← →
Hawk2 © (2004-03-31 12:57) [29]УРААА!!! В контексте одной транзакции вроде все работает отлично!
ВСЕМ СПАСИБО!!!
← →
Курдль © (2004-03-31 12:58) [30]
> Что значит не оправдано? Все через транзакции - даже ApplyUpdates
> :)
Вот и я о том, что ApplyUpdates вызывает, обрабатывает, откатывает транзакции в случае ошибки!
Если в программе нет необходимости в "ручных откатах" (типа юзер долго и нудно набрасывал эскиз, а потом от него отказался), то и нефиг открывать транзакции вручную! :)
← →
Hawk2 © (2004-03-31 13:06) [31]Курдль © (31.03.04 12:50) [27]
А какая разница, цель то одна, нужно обязательно видеть добавленные или измененные записи, причем сразу же! В Гриде который подключен к редактируемому НД все и так отлично отображалось, но данные на сервер не отправлялись и когда в другом окне, в другом IBDataSet-е я открывал этуже таблицу, то я получал данные без этих самых записей (которые были вставлены).
← →
Hawk2 © (2004-03-31 13:12) [32]Курдль © (31.03.04 12:58) [30]
>(типа юзер долго и нудно набрасывал эскиз, а потом от него >отказался), то и нефиг открывать транзакции вручную! :)
С одной стороны правильно, но с другой нефиг этому юзеру сидеть и размышлять, отправлять ему данные или нет! Все будет вводиться из документа, с карточки, а если и проскочет ошибка, то для этого есть возможность коректировки введенных записей! :)
← →
Курдль © (2004-03-31 13:13) [33]
> А какая разница, цель то одна
А средства? Вы подменяете "исправную автоматику" конструкции IBDataBase.ApplyUpdates, да еще держите открытую транзакцию во время insert и всего, что с ним связано (а в таких базах, как IB это чревато).
← →
Vemer © (2004-03-31 13:31) [34]ApplyUpdates к транзакциям вообще отношения не имеет.
← →
Курдль © (2004-03-31 13:33) [35]
> Vemer © (31.03.04 13:31) [34]
> ApplyUpdates к транзакциям вообще отношения не имеет.
:(
← →
Hawk2 © (2004-03-31 14:46) [36]Курдль © (31.03.04 13:13) [33]
>держите открытую транзакцию во время insert и всего, что с ним связано (а в таких базах, как IB это чревато).
А что insert лучше делать при закрытой транзакции? :)
Держать открытыми транзакции вредно? Тогда зачем они вообще?
← →
Курдль © (2004-03-31 16:08) [37]
> А что insert лучше делать при закрытой транзакции? :)
> Держать открытыми транзакции вредно? Тогда зачем они вообще?
1. "Голова человеку дадена не токмо шапку носить!" (с)
А пошто программисту даден механизЬм кэшированных изменений?
Именно затем, чтобы юзер добавлял, изменял, удалял записи до изнеможения, а по желанию - утверждал все свои изменения в БД или забивал на них.
Именно этот метод, а не commit/rollback является боле простым и надежным.
2. Держать открытыми транзакции можно лишь в том случае, если, как я уже говорил, ожидаются "ручные откаты".
Например. Юзер создает сложных документ (типа плана-графика).
Открывается транзакция. Потом он делает изменения во множестве таблиц (которые он тут же видит, но не другие юзеры), задействует при этом массу серверных ресурсов (процедур, ф-ций, триггеров), оценяет все плоды свои в рилтайме и, разочаровавшись, решает все отменить. Вот тогда-то и применяется откат в рамках всей транзакции.
Зачем это применять для единичных изменений в единичной таблице?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.044 c