![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кеш базы??? [D7, XP]
Кузьмич © (2015-06-29 13:18:00)Всем доброго времени суток! Столкнулся с одной непоняткой.
Юзаю Firebird 2.5, пишу инфу в базу хранимками. Например в поле MyField(Numeric 15/2) базы начальное значение: 1 Читаю в проге,вижу 1. Потом пишу значение 2,сразу после записи читаю и вижу прежнее, тоесть 1. Но IBExpert показывает в это время что 2 успешно записалось. Затем для теста делаю по другому,читаю и вижу 1,пишу 2,connect=false,connect=true снова читаю и вижу 2 как и должно быть. В чем может быть трабла?
Кузьмич (2015-06-29 16:13:00) [1]Понятно что ничего не понятно... ((
кгшзх (2015-06-29 16:08:00) [2]ты слушай бразера. он в курсе причины.
и не нервный аноним.
brother (2015-06-29 15:50:00) [3]да не обращай внимания, он у нас нервный аноним... бывает...
Кузьмич (2015-06-29 15:46:00) [4]Только начал осваивать SQL, по ссылке кгшзхне совсем понятна причина проблемы. Если можно обьясните подробнее. Спасибо!
кгшзх (2015-06-29 15:41:00) [5]http://delphimaster.ru/cgi-bin/forum.pl?id=1435321941&n=18
Кузьмич (2015-06-29 15:24:00) [6]Хранимка:
begin
if (:fin_id < 0) then
begin
insert into MyTable(MyField)
values (:FIN_MyField);
end
else
begin
update
MyTable
set
MyField=:FIN_MyField
where
id = :fin_id;
end
end
Пишу в проге своей процедурой:
procedure RecordData(r:Real;sid:String);
begin
try
with DataModule1.IBQuery1 do
begin
SQL.Text := 'execute procedure PROCMYTABLE(' + sid +',:Name_param1)';
DataModule1.IBQuery1.ParamByName('Name_param1').Value :=r;
if not Transaction.Active then Transaction.StartTransaction;
ExecSQL;
Transaction.Commit;
Transaction.Active := false;
end;
except
on E: Exception do
begin
if DataModule1.IBQuery1.Active then DataModule1.IBQuery1.Transaction.Rollback;
Application.MessageBox(PChar(E.Message), 'Ошибка отката данных', MB_ICONERROR);
end;
end;
end;
К IBQuery1 прикручен IBTransaction(DefaultAction=TACommit)
В sid передаю нужный ID, в r нужное значение
Читаю сразу после записи с помощью IBQuery так: select MyField from MyTable
ParamChek=True
Что делаю не так? Может IBQuery1.Close в начале процедуры нужен?
кгшзх (2015-06-29 14:30:00) [7]http://delphimaster.ru/cgi-bin/forum.pl?id=1435321941&n=18
Ega23 (2015-06-29 14:00:00) [8]
> сразу после записи читаю и вижу прежнее, тоесть 1
В пишущей транзакции - будет 2. В другой, будет 1 до коммита пишущей, после будет 2. В случае отката пишущей - значение не изменится.
> Но IBExpert показывает в это время что 2
Значит где-то между записью в твоей транзакции и чтением в IBExpert произошёл коммит.
brother (2015-06-29 13:20:00) [9]комит?