![]() |
Datenbank: Firebird • Version: 2.X • Zugriff über: FibPlus
Lock conflict on no wait transaction ?
Hi,
ich will mit dieser Prozedur gleichzeitige Zugriffe im Netzwerk simulieren :
Delphi-Quellcode:
Durch das Random (2) ist ja klar, dass es irgendwo bald krachen wird. Soll es ja auch. Nach kurzer Zeit kommt (sofern das Programm mehrfach gestartet wird) dann auch dieser Fehler :
procedure TForm1.WriteData (Nr : integer;bez : string);
begin DS.Close; DS.SelectSQL.Text := 'SELECT * FROM TESTTABLE WHERE NR='+IntToStr (Nr); DS.Open; if not DS.IsEmpty then begin DS.Edit; DS.FieldByName('NR').AsInteger := Nr; DS.FieldByName('BEZ').AsString := 'Edit ' + bez; end else begin DS.Insert; DS.FieldByName('NR').AsInteger := Nr; DS.FieldByName('BEZ').AsString := 'Ins ert ' + bez; end; DS.Post; end; procedure TForm1.btn1Click(Sender: TObject); var i,j : Integer; anfang : TTime; begin anfang := now; DB.Open; Randomize; for i := 1 to 2000 do begin j := Random (2); WriteData (j,IntToStr(10 * i)); mem1.Lines.Add(IntToStr(i) + ' Diff. : '+ TimeToStr(now-anfang)+' '+IntToStr (j)); end; WriteTransaction.Commit; end; Zitat:
TRParams (ReadTransaction) : read nowait read_committed rec_version TRParams (WriteTransaction) : write nowait concurrency Bei Database ist ReadTransaction las DefaultTransaction und WriteTransaction als DefaultUpdateTransaction gesetzt. Dann noch das Dataset DS. AutoCommit steht auf true. Transaction : ReadTransaction. UpdateTransAction : WriteTransaction. Jetzt die Frage : wie behandelt man solche Fehler jetzt am besten ? Solche Fehler werden im Realeinsatz zwar eher selten auftreten, behandeln muss man sie aber trotzdem. Wie machen das andere? Sollte man die Transaction-Parameter vielleicht anders setzen ? |
AW: Lock conflict on no wait transaction ?
Wann startest du duie Transaktion(en)?
|
AW: Lock conflict on no wait transaction ?
Momentan sind sie im OI auf true gesetzt.
|
AW: Lock conflict on no wait transaction ?
Hallo,
Update conflicts with concurrent update. Du selbst als Programmierer musst den Konflikt lösen. Eine der beiden Transaktionen muss ein RollBack machen. Heiko |
AW: Lock conflict on no wait transaction ?
Was willst Du denn eigentlich mit den Transaktionen erreichen?
Vielleicht könntest Du ja ohne auskommen? |
AW: Lock conflict on no wait transaction ?
Enteder autocommit oder explizit, aber nicht mischen
|
AW: Lock conflict on no wait transaction ?
Ich bin für explizit weglassen. :)
|
AW: Lock conflict on no wait transaction ?
Äh, was weglassen ? Ganz ohne Transaktionen oder wie ? :shock: Mit Firebird ? :P
Momentaner Stand ist jetzt so (Autocommit = false) :
Delphi-Quellcode:
Was ist davon zu halten ? Sieht so aus, als würde das so laufen. Allerdings weiss ich nicht genau was da geschrieben wird, sofern "Wiederholen" gedrückt wird. :mrgreen:
procedure TForm1.btn1Click(Sender: TObject);
var i,j : Integer; anfang : TTime; answer : TModalResult; begin anfang := now; Randomize; for i := 1 to 2000 do begin answer := idYes; j := Random (25); mem1.Lines.Add(IntToStr(i)); repeat if not DB.Connected then DB.Open; if not WriteTransaction.InTransaction then WriteTransaction.StartTransaction; if not ReadTransaction.InTransaction then ReadTransaction.StartTransaction; try if DebugHook <> 0 then WriteData (j,'IDE '+ IntToStr(10 * i)) else WriteData (j,IntToStr(10 * i)); if WriteTransaction.InTransaction then WriteTransaction.Commit; if ReadTransaction.InTransaction then ReadTransaction.Commit; except answer := MessageBox(Self.Handle,'Wiederholen ?','Information',MB_ICONINFORMATION or MB_YESNO); end; until (Answer = idYes) or (Answer = idNo); if Answer = idNo then Break; end; mem1.Lines.Add(IntToStr(i) + ' Diff. : '+ TimeToStr(now-anfang)+' '+IntToStr (j)); end; |
AW: Lock conflict on no wait transaction ?
"Lock conflict" kann man auch schon zu Begin der Bearbeitung auslösen:
> Benutzer will Objekt bearbeiten > Dummy-Update auf Objekt Fall1: Lock conflict > Rollback > Meldung an Benutzer > Ende Fall2: Objekt ist jetzt für andere Benutzer gesperrt. > eventuell zusätzlich oder aktualisierte Daten lesen > Änderungen vornehmen und Posten > Commit > Ende |
AW: Lock conflict on no wait transaction ?
Zitat:
Es sei denn, ja weiß ich auch nicht. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz