Article View: pl.comp.lang.delphi.bazy-danych
Article #80964Re: Logika pewnej transakcji...
From: ufo
Date: Fri, 11 Dec 2015 18:14
Date: Fri, 11 Dec 2015 18:14
70 lines
3074 bytes
3074 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:; ErrTable:ÚtaQuery; if (DataQuery.State in [dsEdit, dsInsert]) then DataQuery.Post; if (DataQuery.UpdatesPending) then DataQuery.ApplyUpdates; Tables.Add(DataQuery); ErrTable:resFRM.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;
Message-ID:
<n4f08p$rub$1@node2.news.atman.pl>
Path:
polish.pugleaf.net!archive.newsdeef.eu!apf1.newsdeef.eu!news.usenet.farm!..!..!not-for-mail
References:
<n4aad8$c2a$1@node2.news.atman.pl> <566a9c5e$0$22839$65785112@news.neostrada.pl>