Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
6-1077195126
csr
2004-02-19 15:52
2004.04.25
Открытые порты! Трабл!!!


6-1074853790
jcrush
2004-01-23 13:29
2004.04.25
Тормозит прога, потоки....


14-1081161793
Nick-From
2004-04-05 14:43
2004.04.25
Вырубание win 2000 через бат


7-1074700004
Evg12
2004-01-21 18:46
2004.04.25
HDD s/n


11-1065452668
Fligt
2003-10-06 19:04
2004.04.25
В Delphi 7 выдает ошибку "File not found: Exptlntf.dcu "





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский