Pomagajte Deadlock izuzetak...

Mirelica

Početnik
Poruka
25
Pozdrav svima na forumu...
Evo jedno pitanje za vas, bas mi je hitno...
Kako se resava problem Deadlock izuzetka u Delphiu?
Na primer, Pera sa svog klijentskog racunara posmatra neki zapis. Drugi korisnik u mrezi npr. Mika taj isti zapis izmeni na svom klijentskom racunaru.
Pera neznajuci da je Mika, taj zapis izmenio (posto njegov data set nije osvezen),
pokusava da izmeni, i generise se Deadlock izuzetak.
Meni treba da u try ... except bloku razlikujem izuzetke.
Na primer u slucaju Deadlocka ide jedna poruka (MessageDlg('Zapis je vec izmenjen na drugom racunaru',...)),
u slucaju nekog drugog izuzetka ide neka druga poruka, u slucaju treceg neka treca poruka itd...
Da da napomenem RDBMS je Interbase. Hajde ljudi pomagajte, stvar je hitna, hvala unapred...
 
procedure TForm1.Button1Click(Sender: TObject);
var
fileStream: TFileStream;
begin
try
(* Attempt to open a non-existant file *)
fileStream := TFileStream.Create('NOT_THERE.FILE', fmOpenRead);
(* Process the file contents... *)
fileStream.Free;
except
on EFOpenError do ShowMessage('EFOpenError Raised');
else
ShowMessage('Exception Raised');

end;
end;


Evo ti primera iz Delphijevog helpa, koji pokazuje kako da razlikujes izuzetke.
 
Ja sam pokusala nesto slicno ali nista nisam dobila...
Evo koda:
uses DBTables;
...
procedure TForm1.Button3Click(Sender: TObject);
var
E: EDBEngineError;
begin
try
// parametri koje saljem stored proceduri na serveru
proc2.ParamByName('id_korisnika_1').AsString:=Edit1.Text;
proc2.ParamByName('ime').AsString:=Edit2.Text;
proc2.ParamByName('prezime').AsString:=Edit3.Text;
proc2.ParamByName('jmbg').AsString:=Edit4.Text;
proc2.ExecProc;

if IBTransaction1.InTransaction = True then
begin
IBTransaction1.Commit;
end;

except

if E.ErrorCount = 10255 then // za ovaj broj sam nasla negde na netu da pripada deadlock izuzetku
showMessage('Zapis je izmenjen na drugom racunaru');

end;

Eto tako medjutim nista se ne desava i dalje je Deadlock, jel znas mozda bas za taj izuzetak kako da ga obradim, posto nisam sigurna da je ovaj broj ispravan?
 
Nemoj da gledas na netu koji su kodovi gresaka, nego pogledaj koju ti gresku podigne kada izazoves deadlock. Nisam siguran da treba ovako da koristis promenljivu E. Bolje idi na

...
except
on EFOpenError do ShowMessage('EFOpenError Raised');
else
ShowMessage('Exception Raised');

end;

Samo proveri tacno koju gresku ti deadlock podize, i nju uhvati u except sekciji.
 
Puno hvala na pomoci, mislim da sam elegantno resila problem.
Evo mog koda:

var
greska:integer;

try
...
except


on E:EIBInterBaseError do
begin
greska:= EIBInterBaseError(E).IBErrorCode;

case greska of
335544336 : showMessage('GRESKA: Zapis je vec izmenjen na drugom racunaru.'); // ovo je za deadlock
335544344 : showMessage('GRESKA: Nepostojeca baza.');
335544569 : showMessage('GRESKA: Nepoznata tabela.');
335544472 : showMessage('GRESKA: Neispravno korisnicko ime ili lozinka.');
end;

end;
 
Opisan problem nije "deadlock". Radi se o klasicnom problemu na mrezi kada dva korisnika menjaju isti zapis, pa jedan zavrsi malo ranije pre prvog.
Sto se tice "deadlocka", postoji cela nauka o svemu tome pa se to ne moze tek tako prici. Ima tu tehnika i provera i treba tom problemu pristupiti veoma ozbiljno. generalno, ako ce se neki zapis menjati, jedna od varijanti je da se ceo zapis zakljuca, tako da ga niko drugi nece mozi menjati dok se ne ortkljuca, bio izmenjen ili ne. Ako je bio menjan, obavezno osveziti bazu.
Druga je prica, kako ce ostali korisnici videti izmene u databaze. I to se resava na vise nacina. Ne moze se ocekivati da ce korisnik samo gledajuci tekuci slog, odjednom viodeti izmenu ako se nista drugo u kodu nije pripremilo i odradilo...
Ima ti jios, nemam vremena da pisem, nalazim se u GR na odmoru pa ne bih da triosim dragoceno vreme :)

Uglavnom, opisan probvlem nije "deadlock"
 

Back
Top