Форум: "Базы";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];
ВнизНе получается транзакция :( Найти похожие ветки
← →
Романов Р.В. (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.013 c