![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не получается транзакция :( [D5, Paradox]
Романов Р.В. © (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]А как мне тогда удалить строки из нескольких таблиц что бы при этом была возможность в случае ошибки вернуть все на место?