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

Вниз

Не получается транзакция :(   Найти похожие ветки 

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

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

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.

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


 
Johnmen ©   (2003-01-24 01:19) [1]

Принципиально неверна идеология... Понятие транзакций в истинном смысле неприменима к локальным СУБД.


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

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


 
ЮЮ ©   (2003-01-24 07:01) [3]

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


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

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


 
Johnmen ©   (2003-01-24 16:47) [5]

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

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


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

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


 
Johnmen ©   (2003-01-24 16:59) [7]

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


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

А св-во 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 записей, все это не катит


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


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

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


 
Pat ©   (2003-01-26 16:01) [10]

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


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

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


 
Pat ©   (2003-01-26 17:17) [12]

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


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

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


 
MsGuns ©   (2003-01-26 23:58) [14]

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


 
Pat ©   (2003-01-27 14:47) [15]

>Дело в 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;


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


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

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

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


 
Johnmen ©   (2003-01-27 15:22) [17]

>Pat ©

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


 
Romkin ©   (2003-01-27 15:31) [18]

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


 
MsGuns ©   (2003-01-27 16:03) [19]

>Pat © (27.01.03 14:47)

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

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

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

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

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


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

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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2003.02.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
1-38331
bvv
2003-02-03 17:44
2003.02.13
Printer.Canvas -> Bitmap


1-38183
KonstVD
2003-02-03 09:45
2003.02.13
StringGrid


3-38135
marsello
2003-01-27 18:35
2003.02.13
пользователей InterBase


6-38413
Oskolok
2002-12-22 19:24
2003.02.13
Как послать e-mail без специальных компонентов?


4-38643
Gayrus
2003-01-01 16:39
2003.02.13
TWinControl