Article View: pl.comp.lang.delphi.bazy-danych
Article #82640Re: Logika pewnej transakcji...
From: ufo
Date: Fri, 11 Dec 2015 17:14
Date: Fri, 11 Dec 2015 17:14
71 lines
4068 bytes
4068 bytes
W dniu 2015-12-11 o 10:50, wloochacz pisze:
> W dniu 2015-12-09 o 23:36, ufo pisze:
>> Czy znacie jakieś bardziej "eleganckie" sposoby przeprowadzenia takiej
>> transakcji?. Przychodzi mi jeszcze do głowy Rollback i table1.Insert ale
>> wtedy użytkownik traci dane w formularzu i trzeba by je jakoś przywracać.
> Znacie; CachedUpdates, dopóki user nie naciśnie zapisz, nic nie idzie do
> bazy danych.
> Przy Insert masz to co chciałeś, ale przy Edit musisz "jakoś" zablokować
> dokument przed edycją.
> Pewnie UNIDAC coś tam potrafi zrobić, ale ja używam własnej implmentacji
> z blokowanie całkowicie zarządzanym przez apliakację (wiem kto, kiedy i
> z jakiej maszyny zablokował jaki obiekt biznesowy).
>
>
No, zapis informacji o blokadzie może być przydatny i tez to później
wprowadzę. Oczywiście można korzystać z blokowania przez db lub z
własnego mechanizmu. Można także rozważyć lokalną kopię, gdyby komputer
użytkownika wywalił się w połowie zapisu dużego dokumentu.
Unidac z CachedUpdates blokuje rekord w trybie edycji i ustawionym
trybie blokady Pessimistic. Jeśli anuluje się transakcję wystarczy
uruchomić nową i zablokować ponownie funkcją Lock.
Blokowanie przy użyciu mechanizmów db jest wygodne, może mieć jednak
uboczne skutki, bo niektóre engine, zamiast pojedynczego rekordu,
blokują całą stronę (kilka rekordów).
W każdym razie zamieściłem ostateczną wersję na CachedUpdates. Tu każda
tabela po pomyślnym zapisie, dodaje się do listy. A w razie błędu jest
przywracana do stanu przed zapisem (RestoreUpdates) a całośc zapisu
anulowana przez Rollback.
Troszkę tu moich "overridowanych" funkcji ale powinno być zrozumiałe.
if (not mdata.db.InTransaction) then mdata.db.StartTransaction;
Tables:=TList.Create;
try
try
Tables.Capacity:=10;
ErrTable:=DataQuery;
if (DataQuery.State in [dsEdit, dsInsert]) then DataQuery.Post;
if (DataQuery.UpdatesPending) then DataQuery.ApplyUpdates;
Tables.Add(DataQuery);
ErrTable:=adresFRM.adresQUE;
adresFRM.Post(EditMode,15,PrimaryKey,'usr_Key','',false); //to
robi post+applyupdates dla tej tabeli
Tables.Add(adresFRM.adresQUE);
ErrTable:=telfaxFRM.DataQUE;
telfaxFRM.ApplyUpdates;
Tables.Add(telfaxFRM.DataQUE);
ErrTable:=emailFRM.DataQUE;
emailFRM.ApplyUpdates;
Tables.Add(emailFRM.DataQUE);
ErrTable:=komunikatorFRM.DataQUE;
komunikatorFRM.ApplyUpdates;
Tables.Add(komunikatorFRM.DataQUE);
except on E:Exception do
begin
mdata.db.Rollback;
for i := 0 to Tables.Count-1 do
TUniQuery(Tables[i]).RestoreUpdates;
if EditMode=dsEdit then
begin
mdata.db.StartTransaction;
DataQuery.Lock;
end;
if (E is EUniError) then mdata.DataBaseError(E as
EUniError,Self,ErrTable);
raise;
end;
end;
finally
Tables.Free;
end;
Technical Details
Message-ID:
<n4f08p$rub$1@node2.news.atman.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mailReferences:
<n4aad8$c2a$1@node2.news.atman.pl> <566a9c5e$0$22839$65785112@news.neostrada.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail From: ufo <dioblina@dioblina.pl> Newsgroups: pl.comp.lang.delphi.bazy-danych Subject: Re: Logika pewnej transakcji... Date: Fri, 11 Dec 2015 18:14:02 +0100 Organization: ATMAN - ATM S.A. Lines: 71 Message-ID: <n4f08p$rub$1@node2.news.atman.pl> References: <n4aad8$c2a$1@node2.news.atman.pl> <566a9c5e$0$22839$65785112@news.neostrada.pl> NNTP-Posting-Host: 91.188.114.23 Mime-Version: 1.0 X-Trace: node2.news.atman.pl 1449854041 28619 91.188.114.23 (11 Dec 2015 17:14:01 GMT) X-Complaints-To: usenet@atman.pl NNTP-Posting-Date: Fri, 11 Dec 2015 17:14:01 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 In-Reply-To: <566a9c5e$0$22839$65785112@news.neostrada.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit