![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транзакции [D5, Paradox]
ka © (2004-05-19 17:10:00)Приветствую.
Нужно удалить строку из одной таблицы и добавить строку в другую таблицу в рамках одной транзакции. Я делаю это так:
DataBase1.StartTransaktion
try
…
…
…
DataBase1.Commit;
except
DataBase1.RollBack;
end;
Все бы хорошо, но после того как я проверил как же работают транзакции, я увидел, что в моем варианте они вообще не работают.
Я благополучно удалил строку из одной таблицы (проверил физически из файла таблицы строка удалилась, я думал что этого быть не должно) вызвал ошибку произошел откат - DataBase1.Rollback, а в таблице удаленная строка не появилась. В чем дело? Я подумал может дело в кэшировании страниц, добавил DataBase1.ApplyUpdates(…),DataBase1.CanselUpdates(…) убрал DataBase1.StartTransaktion, DataBase1.Commit, DataBase1.RollBack. Да еще включил Query.CashedUpdates.
Вот.
В чем я протуканил?
ka (2004-05-19 19:07:00) [1]Все равно спасибо всем кто помог.
ka (2004-05-19 18:33:00) [2]А что такое FireBird и где ее взять.
Соловьев (2004-05-19 18:30:00) [3]
> [19] ka © (19.05.04 18:28)
если хочешь нормальные транзакции и бесплатно - [9]
ka (2004-05-19 18:28:00) [4]Я же серьезно :-(((
Я никогда не писал базы данных до самой этой пурги. Вот и вляпался.
Johnmen (2004-05-19 18:25:00) [5]>на что менее болезнено можно перети.
Соловьев © (19.05.04 17:57) [9]
Хотя болевой попрог у каждого свой...:)
Mike Kouzmine (2004-05-19 18:24:00) [6]FB
ka (2004-05-19 18:23:00) [7]Как это нет. Елки палки - так это все полная лажа. Заечем вообще придумали парадокс.
Тогда следующий вопрос: на что менее болезнено можно перети.
Mike Kouzmine (2004-05-19 18:18:00) [8]Там эмуляция. Таблицы не должны открываться, закрываться в течении всей транзакции. Иначе не работает. Вот как быть с ExecSql? Я не пробовал. Работает ли с запросами? Может для каждого запроса надо использовать свой TQuery?
Соловьев (2004-05-19 18:12:00) [9]
> [13] ka © (19.05.04 18:10)
потому что в парадоксе их нет :)
ka (2004-05-19 18:10:00) [10]Да нет при проектировании все нормально суть же не в этом. Мне нужно узнать почему же у меня не работали транзакции.
Johnmen (2004-05-19 18:04:00) [11]>выбирается конкретный товар и переносится из таблицы проданных
>товаров в таблицу на складе.
Т.е. сначала продали, а потом вернули ? :)
Я думаю глобальная проблема - неточности при проектировании БД. В данном случае надо бы сделать так, чтобы переброска товара заключалась в UPDATE нужной записи в соответствующей таблице.
ka (2004-05-19 18:01:00) [12]Да самое ужасное, что не только начал, начал уже давно, и сделано уже много. А что так все запущено с этим парадоксом?? :-(
Курдль (2004-05-19 17:59:00) [13]
> ka © (19.05.04 17:55) [8]
> Дело в том, что это обмен товара в БД магазина. То есть
> выбирается конкретный товар и переносится из таблицы проданных
> товаров в таблицу на складе. Поэтому и построчно.
Про зарплату "построчно" - это я о размере кода.
А "перенос товара на склад" - это нонсенс достойный орешника!
А не достаточно было "носить" ID-шник одной записи? :)
Соловьев (2004-05-19 17:57:00) [14]
> Да еще БД локальная.
Пока только начал уйди нафиг ты с этого парадокса- скачай FireBird и разберись с ним.
ka (2004-05-19 17:55:00) [15]Дело в том, что это обмен товара в БД магазина. То есть выбирается конкретный товар и переносится из таблицы проданных товаров в таблицу на складе. Поэтому и построчно.
Курдль (2004-05-19 17:49:00) [16]
> ka © (19.05.04 17:35) [3]
Вы зарплату получаете "построчно", как журналист? :)
ka (2004-05-19 17:48:00) [17]Генерации для исключения здесь нет. Она была после удаления записи о продажи.
Да еще БД локальная.
Когда я включал CashedUpdates в файле таблицы после удаления запись удалялась. А почему? Ведь это должно было случиться только после ApplyUpdates?
Курдль (2004-05-19 17:42:00) [18]
> Процедура выполняющая обмен товара - подробно. (Здесь без
> CashedUpdates)
А почему? Мне кажется, что это бы решило все проблемы.
Reindeer Moss Eater (2004-05-19 17:38:00) [19]Ну и где здесь генерация исключения для прерывания транзакции?
ka (2004-05-19 17:35:00) [20]Процедура выполняющая обмен товара - подробно. (Здесь без CashedUpdates)
procedure TfExchange.DoReturn;
var i,SysNo,code:longword;
SL:TStringList;
sSizes,sProcure_price,sReception_date,sBat:string;
begin
DataBase1.StartTransaction;
try
SL := TStringList.create;
i := choiserow - 1;
SysNo := Query1.FieldByName('pSysNo').AsInteger;
code := Query1.FieldByName('trCode').AsInteger;
sSizes := Query1.FieldByName('trSize').AsString;
sProcure_price :=Query1.FieldByName('trProcur_price').AsString;
sReception_date :=Query1.FieldByName('trReception_date').AsString;
sBat :=Query1.FieldByName('trBat').AsString;
if i >= 0 then
begin
//Удалить запись о продаже из таблицы продаж.
SL.Clear;
SL.Add('DELETE FROM '+ tradetableex);
SL.Add('WHERE trCode = '+IntToStr(code));
querysql(SL,true);
//Добавить в таблицу размеров запись.
SL.clear;
SL.Add('INSERT INTO ' + sectablenameex);
SL.Add('(sSysNo,sSizes,sProcure_price,sReception_date,sBat)');
SL.Add('VALUES');
SL.Add('(' + '"'+ IntToStr(SysNo) + '", "'+ sSizes+ '",');
SL.Add('"'+ sProcure_price +'", "'+sReception_date+'" ,"'+sbat+'");');
querysql(SL,true);
end;
DataBase1.Commit;
except
on EO:Exception do
begin
DataBase1.Rollback;
MessageDlg('Ошибка при работе с базой данных. Возврат не выполнен.'
+ #13#13 + EO.Message ,mtError,[mbOk],0);
end;
end
end;