Текущий архив: 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.5 MB
Время: 0.043 c