Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

Почему 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.024 c
1-1081522538
acrona
2004-04-09 18:55
2004.04.25
Работа с другими программами


1-1081497806
Vlad1
2004-04-09 12:03
2004.04.25
Проблемы с Delphi 8. WinXP


11-1065002302
Ал
2003-10-01 13:58
2004.04.25
PopUp меню, открываемое при щелчке по иконке в трее


3-1080793639
Badboy
2004-04-01 08:27
2004.04.25
QuickReport


6-1076274112
ser_ega
2004-02-09 00:01
2004.04.25
Инет