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

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

Не получается транзакция :( [D5, Paradox]


Страницы:   1 2

Романов Р.В. ©   (2003-01-23 22:15:00) 

Выполняю запрос

Delete
from test1.db
where (N = 30)

через процедуру ExecErr при i = 0. Ошибка генерируется переходим на db1.Rollback, но записи из таблицы все равно удаляются.

procedure TForm1.ExecErr(i: Integer);
begin
db1.StartTransaction;
try
Query1.SQL.Clear;
Query1.SQL.Text := Memo1.Text;
Query1.ExecSQL;
ShowMessage(IntTostr(10 div i));
db1.Commit;
except
db1.Rollback;
end;
end;

При стандартных настройках компонента DataBase в строке
db1.StartTransaction
появлялась ошибка "The transaction isolation level must be dirtly read for local databases".
Я поставил TransIsolation в tiDirtyRead.

Что я делаю неправильно?


Романов Р.В.   (2003-01-27 16:30:00) [1]


> А должно быть не такое как у Db1, а именно оно (Db1)


У меня так сделано.

db1..AliasName = "testb"
db1.DatabaseName = "qwe"
Query1.DatabaseName = "qwe"


Mike Kouzmine   (2003-01-27 16:11:00) [2]

При использовании "транзакций" (парадокс, дбайз, фокс) создается таблица с описанием операций, на основании их и производится откат, а ограничение на 255 записей - это или поле типа байт, накладывает ограничение или (что более вероятно) не стали морочиться, а то получилась бы неповоротливая конструкция.


MsGuns   (2003-01-27 16:03:00) [3]

>Pat © (27.01.03 14:47)

Ага, и это если формат - парадокс (дибэйс, фокс) ?

"Транзакционные" методы есть у компонентов BDE потому, что она типа универсальная и может работать не только с "родными" форматами, но и с "чужеродными", например, клиент-серверными СУБД. Вот во втором случае, если сервер поддержит такой запрос, он и будет выполнен ! Кстати, в хэлпах по БДЕ очень неплохо об этом написано. В частности посоветую попристальнее изучить методыи св-ва TSession и TDataBase (TransIsolation, InTransaction, KeepConnection, для начала)

Для локалок же это по большому счету-фикция. Единственное, что можно "изобразить" похожее на "групповуху" - это манипулирование буферами, куда предварительно пишется/считывается порция записей.
Но и здесь облом, т.к. ограничение ОДИН БУФЕР-ОДНА ТАБЛИЦА в корне ломает логику ступенчатых модификаций.

В 9-м парадоксе, похоже, соорудили чегой-то эмулирующее цепочки запросов и, работающее, скорее всего, через тот же механизм буферов. Но это, увы, не СЕРВЕР.

А впрочем, никто не мешает верить в доброе, вечное...
Флаг в руки ;))


Romkin   (2003-01-27 15:31:00) [4]

Транзакции в PDox через BDE не позволяют изменять более 255 записей (точнее, позволяют, ошибки не даст, вот только результат непредсказуем).


Johnmen   (2003-01-27 15:22:00) [5]

>Pat ©

Можно поподробнее про транзакции применительно к Парадоксу ?
:))))


Mike Kouzmine   (2003-01-27 15:13:00) [6]


> А св-во databasename у query1 какое?

>>Такое же как у db1.

А должно быть не такое как у Db1, а именно оно (Db1)


Pat   (2003-01-27 14:47:00) [7]

>Дело в BDE, которая транзакции не поддерживает

procedure TForm1.ApplyButtonClick(Sender: TObject);

begin
with CustomerQuery do
begin
Database1.StartTransaction;
try
ApplyUpdates; {try to write the updates to the database};
Database1.Commit;{on success, commit the changes};
except
Database1.Rollback;{on failure, undo the changes};
raise; {raise the exception to prevent a call to CommitUpdates!}
end;
CommitUpdates; {on success, clear the cache}
end;

end;


MsGuns   (2003-01-26 23:58:00) [8]

Дело в BDE, которая транзакции не поддерживает


Романов Р.В.   (2003-01-26 17:38:00) [9]

Тогда почему транзакции могут работать только с Paradox 9. Дело в драйверах или в формате файлов таблиц?


Pat   (2003-01-26 17:17:00) [10]

>Наверне какие-то dll еще есть?
Для самой БД нет...dll"ки - драйвера для работы с твоей БД (BDE, например)


Романов Р.В.   (2003-01-26 16:21:00) [11]

У меня Paradox 7. Интересно, а из чего состот локальная база, кроме каталога с файлами таблиц. Наверне какие-то dll еще есть?


Pat   (2003-01-26 16:01:00) [12]

Некоторые локальные базы данных, такие как Paradox 9, также могут поддерживать транзакции.© Стив Тейксейра. Delphi 5. Руководство разработчика. Том 2


Романов Р.В.   (2003-01-26 10:45:00) [13]


> А св-во databasename у query1 какое?

Такое же как у db1. Но если вы утверждаете что если удаляет больше 255 записей, все это не катитприменять такую транзакцию не имеет смысла.


Mike Kouzmine   (2003-01-24 17:22:00) [14]

А св-во databasename у query1 какое?
if db1.intransaction then db1.rollback (or commit)
db1.starttransaction
....
if db1.intransaction then db1.commit;
except
if db1.intransaction then db1.rollback
...
Должно работать. (у меня работает), правда если удаляет больше 255 записей, все это не катит


Johnmen   (2003-01-24 16:59:00) [15]

Начинать лучше сразу с большого, в смысле серьезного...
Я бы рекомендовал IB и клоны...


Романов Р.В.   (2003-01-24 16:51:00) [16]

Печально. Я хотел начать с малого (с локальных баз). Придется ставить какой нибуть сервер.


Johnmen   (2003-01-24 16:47:00) [17]

>Романов Р.В. ©

Не работают, ввиду своего отсутствия...:)


Романов Р.В.   (2003-01-24 15:21:00) [18]

Тоесть получается что в локальных базах транзакции не работают?


ЮЮ   (2003-01-24 07:01:00) [19]

Если уж решился их удалять, зачем возврашать?
И какая ошибка может возникнуть по ходу удаления записей?


Романов Р.В.   (2003-01-24 05:13:00) [20]

А как мне тогда удалить строки из нескольких таблиц что бы при этом была возможность в случае ошибки вернуть все на место?


Страницы:   1 2

Наверх

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