![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
И снова транзакции! [D7, IB6.x]
maximus_ © (2004-07-02 12:16:00)Я дико извиняюсь, но опять вопрос про транзакции!
Если делать так:
IBDataSet1.Insert;
IBDataSet1.FieldByName('NUMBERING').AsInteger:=1;
IBDataSet1.FieldByName('TEXT1').AsString:='TEST1';
IBDataSet1.FieldByName('TEXT2').AsString:='TEST2';
IBDataSet1.Post;
Естественно при повторном открытии запроса данных уже нет!
при добавлении:
IBTransaction1.Commit;
и при повторном открытии запроса опять ничего не записывается!
В установках IBTransaction1 стоит: READ COMMITED;
IBDataSet все запросы (modify, insert...) сформированны автоматом!
Вопрос:
1)
Для подтверждении транзакции достаточно ли строки
IBTransaction1.Commit; ?
2)
IBTransaction1.StartTransaction;
--
--
IBTransaction1.Commit;
Расценивается как операторные скобки?
перечитал уже 5 раз главу управление транзакциями, сделал все как написано, но остановился на подтверждении...
jack128 (2004-07-02 18:39:00) [1]
> А чё там учиться? Если на Паскале ты умеешь:
>
> if a = 1 then
> begin
> b := 2;
> end;то бОльшую часть понятия о транзакциях имеешь
Да?
а вот все это - это так.. Мелочи..?
http://www.ibase.ru/devinfo/ibtrans.htm
А потом появляются вопросы, типа "а почему я делал коммит, а данных не видно?"
Курдль (2004-07-02 13:15:00) [2]
> Соловьев © (02.07.04 12:58) [21]
> думаю, если конечно в БД пару таблиц, и простенький отчет с одним пользователем, то транзакции можно отдать компонентам.
А я так не думаю! Даже при весьма сложненьких отчетах и множеством таблиц, нормально отрабатывает конструкция
Database.ApplyUpdates([DataSet1, DataSet1, ...DataSetN]);
Явные транзакции только усложняют код и лучше их применять, когда происходит связанное обновление данных разными модулями и в прочих нетривиальных ситуациях.
Курдль (2004-07-02 13:00:00) [3]
> Научиться надо!
А чё там учиться? Если на Паскале ты умеешь:
то бОльшую часть понятия о транзакциях имеешь!
if a = 1 then
begin
b := 2;
end;
Так что дальше можешь спокойно писать
if a = 1 then b := 2;
Соловьев (2004-07-02 12:58:00) [4]
> Для бОльшей части типовых задач стандартная обработка транзакций
> вполне приемлемое решение.
не спорю. но автор хочет я так понял разобраться с ними или как? примеры вот по книге делает. думаю, если конечно в БД пару таблиц, и простенький отчет с одним пользователем, то транзакции можно отдать компонентам.
Sergey_Masloff (2004-07-02 12:56:00) [5]Соловьев © (02.07.04 12:40) [14]
>2 maximus_ © - не слушай. Управляй сам транзакциями.
Совет сомнительный. Для бОльшей части типовых задач стандартная обработка транзакций вполне приемлемое решение.
maximus_ (2004-07-02 12:55:00) [6]2Курдль ©>
Вот хрень блин!!! Уже 2 часа парился с этим!
Действительно надо "CachedUpdates := False"
А это я на будущее возьму на вооружение:
IBDatabase1.ApplyUpdates([IBDataSet1]);
>> Так не подскажешь, зачем в данном конкретном случае автору самому управлять транзакциями?
Научиться надо!
Соловьев (2004-07-02 12:54:00) [7]
> я то имел ввиду как это делать программно!
Мы говорили про эксперт. У тебя было свойство CachedUpdates включено. Выключи его. И будет тебе счастье.
> Так не подскажешь, зачем в данном конкретном случае автору
> самому управлять транзакциями?
Это нормально. можно конечно и как Вы предлагаете, но имхо для начинающих сразу понять, что транзакции в СУБД не 5-я нога.
Курдль (2004-07-02 12:51:00) [8]
> Соловьев © (02.07.04 12:40) [14]
> 2 maximus_ © - не слушай. Управляй сам транзакциями.
Возможно я и не прав. Большое достоинство участия на форуме - процесс обучения, самообучения и приема чужого опыта.
Так не подскажешь, зачем в данном конкретном случае автору самому управлять транзакциями?
> Курдль © (02.07.04 12:30) [8]
> CachedUpdates := ?
> maximus_ © (02.07.04 12:31) [9]
> true
Так ты что с этим решил? Тебе надо либо CachedUpdates := False, либо [12]
maximus_ (2004-07-02 12:49:00) [9]2Соловьев ©>
это я понял что там тоже надо коммит нажать!
я то имел ввиду как это делать программно!
2Курдль ©>
Попробовал работает!!!
Но я думаю что Соловьев прав!
Соловьев (2004-07-02 12:41:00) [10]
> изменений не вижу в самой таблице!
там тоже надо коммит нажать.
Соловьев (2004-07-02 12:40:00) [11]
> это я как дохтур рекомендую
действительно - дохтур. сорри если обдел.
2 maximus_ © - не слушай. Управляй сам транзакциями.
maximus_ (2004-07-02 12:39:00) [12]Открываю SQL редактор:
1) выполняю запрос!
2) пишет: 1 record(s) was(were) inserted into TEST
3) нажимаю в редакторе коммит!!! изменений не вижу в самой таблице!
4) в окне таблицы нажимаю еще раз коммит, и она занесена!!!
Курдль (2004-07-02 12:36:00) [13]А!!!!!!!! Ну тарды забей на транзакции (это я как дохтур рекомендую) Т.е. вообще забудь - ты на правильном пути.
И делай такTIBDatabase.ApplyUpdates([IBDataSet]);
Я считаю, что это лучший вариант, хоть можно и поспорить.
В данном случае транзакция откроется автоматически, при успешной операции автоматически подтвердится, а при ошибке - автоматически откатит изменения.
Соловьев (2004-07-02 12:34:00) [14]
> [10] maximus_ © (02.07.04 12:33)
выполни запрос в эксперте - меняет?
maximus_ (2004-07-02 12:33:00) [15]Сейчас попробовал так:
insert into TEST
(NUMBERING, TEXT1, TEXT2)
values
(:OLD_NUMBERING,
:OLD_TEXT1,
:OLD_TEXT2)
Все равно ничего не меняет!
maximus_ (2004-07-02 12:31:00) [16]true
Курдль (2004-07-02 12:30:00) [17]CachedUpdates := ?
Johnmen (2004-07-02 12:30:00) [18]>Естественно при повторном открытии запроса данных уже нет!
Э-э-э... Откуда естественность ?
maximus_ (2004-07-02 12:25:00) [19]Sorry,
insert into TEST
(NUMBERING, TEXT1, TEXT2)
values
(:NUMBERING, :TEXT1, :TEXT2)
Курдль (2004-07-02 12:22:00) [20]
> maximus_ © (02.07.04 12:20) [3]
> >А уточнить, что в запросах на добавление, модификацию,
> удаление?
>
> на добавление!!!
Я хотел посмотреть содержимое, а не факт наличия :)