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

Вниз

Транзакции   Найти похожие ветки 

 
ka ©   (2004-05-19 17:10) [0]

Приветствую.
Нужно удалить строку из одной таблицы и добавить строку в другую таблицу в рамках одной транзакции. Я делаю это так:

DataBase1.StartTransaktion
try



DataBase1.Commit;
except
DataBase1.RollBack;
end;

Все бы хорошо, но после того как я проверил как же работают транзакции, я увидел, что в моем варианте они вообще не работают.
Я благополучно удалил строку из одной таблицы (проверил физически из файла таблицы строка удалилась, я думал что этого быть не должно) вызвал ошибку произошел откат - DataBase1.Rollback, а в таблице удаленная строка не появилась. В чем дело? Я подумал может дело в кэшировании страниц, добавил  DataBase1.ApplyUpdates(…),DataBase1.CanselUpdates(…) убрал DataBase1.StartTransaktion, DataBase1.Commit, DataBase1.RollBack. Да еще включил Query.CashedUpdates.
Вот.
В чем я протуканил?


 
Reindeer Moss Eater ©   (2004-05-19 17:28) [1]

Прочитай раздел "Transactions on Paradox, dBASE, FoxPro, and Access" из Borland Database Engine Online Reference


 
Mike Kouzmine ©   (2004-05-19 17:28) [2]

Наппиши как ты это сделал подробно.


 
ka ©   (2004-05-19 17:35) [3]

Процедура выполняющая обмен товара - подробно. (Здесь без 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;


 
Reindeer Moss Eater ©   (2004-05-19 17:38) [4]

Ну и где здесь генерация исключения для прерывания транзакции?


 
Курдль ©   (2004-05-19 17:42) [5]


> Процедура выполняющая обмен товара - подробно. (Здесь без
> CashedUpdates)

А почему? Мне кажется, что это бы решило все проблемы.


 
ka ©   (2004-05-19 17:48) [6]

Генерации для исключения здесь нет. Она была после удаления записи о продажи.
Да еще БД локальная.
Когда я включал CashedUpdates в файле таблицы после удаления запись удалялась. А почему? Ведь это должно было случиться только после ApplyUpdates?


 
Курдль ©   (2004-05-19 17:49) [7]


> ka ©   (19.05.04 17:35) [3]

Вы зарплату получаете "построчно", как журналист?  :)


 
ka ©   (2004-05-19 17:55) [8]

Дело в том, что это обмен товара в БД магазина. То есть выбирается конкретный товар и переносится из таблицы проданных товаров в таблицу на складе. Поэтому и построчно.


 
Соловьев ©   (2004-05-19 17:57) [9]


> Да еще БД локальная.

Пока только начал уйди нафиг ты с этого парадокса- скачай FireBird и разберись с ним.


 
Курдль ©   (2004-05-19 17:59) [10]


> ka ©   (19.05.04 17:55) [8]
> Дело в том, что это обмен товара в БД магазина. То есть
> выбирается конкретный товар и переносится из таблицы проданных
> товаров в таблицу на складе. Поэтому и построчно.

Про зарплату "построчно" - это я о размере кода.
А "перенос товара на склад" - это нонсенс достойный орешника!
А не достаточно было "носить" ID-шник одной записи? :)


 
ka ©   (2004-05-19 18:01) [11]

Да самое ужасное, что не только начал, начал уже давно, и сделано уже много. А что так все запущено с этим парадоксом?? :-(


 
Johnmen ©   (2004-05-19 18:04) [12]

>выбирается конкретный товар и переносится из таблицы проданных
>товаров в таблицу на складе.

Т.е. сначала продали, а потом вернули ? :)
Я думаю глобальная проблема - неточности при проектировании БД. В данном случае надо бы сделать так, чтобы переброска товара заключалась в UPDATE нужной записи в соответствующей таблице.


 
ka ©   (2004-05-19 18:10) [13]

Да нет при проектировании все нормально суть же не в этом. Мне нужно узнать почему же у меня не работали транзакции.


 
Соловьев ©   (2004-05-19 18:12) [14]


> [13] ka ©   (19.05.04 18:10)

потому что в парадоксе их нет :)


 
Mike Kouzmine ©   (2004-05-19 18:18) [15]

Там эмуляция. Таблицы не должны открываться, закрываться в течении всей транзакции. Иначе не работает. Вот как быть с ExecSql? Я не пробовал. Работает ли с запросами? Может для каждого запроса надо использовать свой TQuery?


 
ka ©   (2004-05-19 18:23) [16]

Как это нет. Елки палки - так это все полная лажа. Заечем вообще придумали парадокс.
Тогда следующий вопрос: на что менее болезнено можно перети.


 
Mike Kouzmine ©   (2004-05-19 18:24) [17]

FB


 
Johnmen ©   (2004-05-19 18:25) [18]

>на что менее болезнено можно перети.

Соловьев ©   (19.05.04 17:57) [9]

Хотя болевой попрог у каждого свой...:)


 
ka ©   (2004-05-19 18:28) [19]

Я же серьезно :-(((
Я никогда не писал базы данных до самой этой пурги. Вот и вляпался.


 
Соловьев ©   (2004-05-19 18:30) [20]


> [19] ka ©   (19.05.04 18:28)

если хочешь нормальные транзакции и бесплатно - [9]


 
ka ©   (2004-05-19 18:33) [21]

А что такое FireBird и где ее взять.


 
ka ©   (2004-05-19 19:07) [22]

Все равно спасибо всем кто помог.



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

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

Наверх




Память: 0.52 MB
Время: 0.022 c
1-1085989896
Andrei
2004-05-31 11:51
2004.06.13
TfileStream


14-1085609507
Юрий
2004-05-27 02:11
2004.06.13
Как бы выкачать этот ресурс...


4-1083872851
Dmitriy Volkov
2004-05-06 23:47
2004.06.13
Как узнать права юзера?


1-1086002353
BorisMor
2004-05-31 15:19
2004.06.13
Прозрачный контрол


3-1084973834
Gennadiy
2004-05-19 17:37
2004.06.13
Как сделать для IBQuery чтото типа свойства ReadOnly??