Ich arbeite mit ADO 2.5 und SQL-Server 7. Ich habe eine Anwendung geschrieben, die die Belastung des Servers simulieren soll. Hierzu werden miteinander verknüfpte Tabellen per Zufallsgenerator verändert. Ich benutze TADOTable und TADOQuery. Das Programm soll auf mehreren Rechnern laufen. Sind mehrere Clients des Programmes aktiv, so kommt es häufig zu Deadlocks.
Wie kann ich diese Deadlocks auf dem Client abfangen, um ein Rollback und die Wiederholung der Transaktion zu ermöglichen?
Hier der Beispiel- Quelltext:
While Bitbtn1.Tag = 0 do begin
Application.ProcessMessages;
EndeI:=Random(4);
If EndeI = 0 then EndeI:=1;
for i:=1 to EndeI do begin
case i of
1: begin
...
2: begin
with ADOTable2 do
begin
Application.ProcessMessages;
jj:= Random(Trunc((RecordCount)/10));
if jj=0 then jj:=1;
for J:= 1 to jj
do begin
Close;
Open;
DisableControls;
EndeK:=Random(RecordCount);
if EndeK=0 then EndeK:=1;
for k:=1 to EndeK do Next;
EnableControls;
Application.ProcessMessages;
if bitbtn1.Tag = 1 then Abort;
try
ADOConnection1.BeginTrans;
Edit;
Post;
Edit;
FieldByName('Bezeichnung').AsString:='Bezeichnung: '+IntToStr(k);
FieldByName('Kostenanschlag_DM').Value:=k;
Post;
ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
Close;
Open;
MessageDlg('T_E: Datensatz gesperrt - bitte wiederholen.', mtInformation,[mbOk], 0);
end;
Application.ProcessMessages;
end;
end; // With ADOTable2
end; // 2:
3: begin
....
end;
...
usw.
Ich wäre dankbar für eine Lösung.
Volker Lauckner
Wie kann ich diese Deadlocks auf dem Client abfangen, um ein Rollback und die Wiederholung der Transaktion zu ermöglichen?
Hier der Beispiel- Quelltext:
While Bitbtn1.Tag = 0 do begin
Application.ProcessMessages;
EndeI:=Random(4);
If EndeI = 0 then EndeI:=1;
for i:=1 to EndeI do begin
case i of
1: begin
...
2: begin
with ADOTable2 do
begin
Application.ProcessMessages;
jj:= Random(Trunc((RecordCount)/10));
if jj=0 then jj:=1;
for J:= 1 to jj
do begin
Close;
Open;
DisableControls;
EndeK:=Random(RecordCount);
if EndeK=0 then EndeK:=1;
for k:=1 to EndeK do Next;
EnableControls;
Application.ProcessMessages;
if bitbtn1.Tag = 1 then Abort;
try
ADOConnection1.BeginTrans;
Edit;
Post;
Edit;
FieldByName('Bezeichnung').AsString:='Bezeichnung: '+IntToStr(k);
FieldByName('Kostenanschlag_DM').Value:=k;
Post;
ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
Close;
Open;
MessageDlg('T_E: Datensatz gesperrt - bitte wiederholen.', mtInformation,[mbOk], 0);
end;
Application.ProcessMessages;
end;
end; // With ADOTable2
end; // 2:
3: begin
....
end;
...
usw.
Ich wäre dankbar für eine Lösung.
Volker Lauckner
Comment