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

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

Транзакции в Firebird [D7, FireBird 1.0.3]


serguncho ©   (2005-06-26 19:52:00) 

Доброго времени суток!

Не могу понять в чем проблема:
 
var dbmain:tibdatabase;
   ibtable1:tibtable;
...
dbMain.DefaultTransaction.StartTransaction;
try
 ibtable1.FieldByName('NO').AsInteger := 22;
 dbMain.DefaultTransaction.Commit;
except
 dbMain.DefaultTransaction.RollBack;
 raise;
...


пишет что транзакция активна.

И еще такой косяк: удаляю запись из таблицы (table.delete). Закрываю программу, а запись на прежнем месте.


Dazhan   (2005-06-27 17:46:00) [1]

TIBTable нет смысла использовать, так как TIBTable все равно осуществляет те же SQL-запросы. Просто управлять ими в TIBTable невозможно. Да к тому же нет смысла закачивать всю таблицу, как правило работают с какими-то выборками, да и то сразу из нескольких таблиц.


Zacho   (2005-06-27 11:55:00) [2]

serguncho ©   (27.06.05 10:21) [13]
Скажите, а в чем ограниченность Ibquery для SELECT?


Ни в чём. А вот недостатки с модификацией данных по сравнению с TIBDataSet есть.
1. Нужно использовать 2 компонента.
2. Нельзя использовать ХП.

> И что скажете про IBSQL?


А что ты хочешь услышать ?
Это компонет для выполнения запросов.

Ты всё-таки прочитай http://www.ibase.ru/devinfo/ibx.htm


serguncho   (2005-06-27 10:21:00) [3]

Скажите, а в чем ограниченность Ibquery для SELECT?
И что скажете про IBSQL?


Sergey13   (2005-06-27 10:15:00) [4]

2[11] serguncho ©   (27.06.05 10:11)
>В чем же минусы таблиц и запросов?
В отсутствии плюсов. 8-) Особенно для таблиц. Запросы хороши (и необходимы) для НЕ селектов.


serguncho   (2005-06-27 10:11:00) [5]

P.N.P. ©   (27.06.05 09:38) [10]
>serguncho ©   (27.06.05 09:11) [9]
>А чего же..
TIBDataSet
----

Не, я еще морально не готов полностью перейти на SQL :-))
В чем же минусы таблиц и запросов?


P.N.P.   (2005-06-27 09:38:00) [6]

>serguncho ©   (27.06.05 09:11) [9]
>А чего же..
TIBDataSet


serguncho   (2005-06-27 09:11:00) [7]

Zacho ©   (27.06.05 07:58) [8]

P.S. Ещё один небольшой совет: не стоит использовать TIBTable и TIBQuery.
---------
А чего же использовать тогда?


Zacho   (2005-06-27 07:58:00) [8]

serguncho ©   (27.06.05 0:15) [5]
удаляю запись из таблицы. Перезапускаю программу, а запись на прежнем месте.


Надо делать Commit.

P.S. Ещё один небольшой совет: не стоит использовать TIBTable и TIBQuery.


kaif   (2005-06-27 03:09:00) [9]

сделай так:

with dbMain.DefaultTransaction do
if not InTransaction then 
 StartTransaction;

здесь Open-ы, Post-ы и Delete-ы
(Вообще-то кроме присвоения поля принято еще и Post делать :)

with dbMain.DefaultTransaction do
if InTransaction then
 CommitRetaining; //если не устраивает, чтобы запросы закрылись

или

with dbMain.DefaultTransaction do
if InTransaction then
 Commit; //если устраивает, чтобы запросы закрылись

Потом можно заново их открыть.

Еще у транзакии изоляцию поставь. Для начала ReadCommitted хватит в 99% случаев.

Откаты делай только если одновременно несколько действийнужно откатить. Одно действие можно и не откатывать. Если оно не прошло - не прошло. Что тут откатывать блоке в try-except-end?  

А вообще читай.


DrPass   (2005-06-27 02:25:00) [10]


> serguncho ©   (26.06.05 20:25) [2]

post - это, грубо говоря, применение сделанных тобой изменений над текущей записью. Транзакция тут не причем.

> serguncho ©   (27.06.05 00:15) [5]

Наверное же все-таки потому, что ты после удаления не завершаешь транзакцию.
> если убрать
> dbMain.DefaultTransaction.StartTransaction
>
> то в результате выполнения таблицы все становятся пассивными
> (Active=false),

Да, потому что после Commit транзакция завершается, и автоматически закрываются источники данных. Поэтому их нужно открывать после этого. А еще лучше - отображение данных выполнять в одной read-only транзакции (которую вообще можно не закрывать), а изменения - в другой.
> сама database становится connected=false

Ну, это ты преувеличил :)


serguncho   (2005-06-27 00:15:00) [11]

спасибо, почитаю на свежую голову.

А не подскажите, пожалуйста, что с этой проблемой делать:
удаляю запись из таблицы. Перезапускаю программу, а запись на прежнем месте.


Zacho   (2005-06-26 23:06:00) [12]

serguncho ©   (26.06.05 20:28) [3]

Почитай http://www.ibase.ru/devinfo/ibx.htmи http://www.ibase.ru/devinfo/ibtrans.htm


serguncho   (2005-06-26 20:28:00) [13]

если убрать
dbMain.DefaultTransaction.StartTransaction

то в результате выполнения таблицы все становятся пассивными (Active=false), сама database становится connected=false.
Перезапуск программы показывает, что изменений информации не происходит.


serguncho   (2005-06-26 20:25:00) [14]

А смысл в post? Ведь это тоже транзакция.


DrPass   (2005-06-26 20:22:00) [15]

Если пишет, что активна - значит активна. Убери
dbMain.DefaultTransaction.StartTransaction.
Или замени на if not ...Active then dbMain.DefaultTransaction.StartTransaction, раз ты ее закрываешь время от времени :)
И еще наверное не помешало бы добавить ibtable1.edit и ibtable1.post в нужном месте.


Наверх

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