Entwickler-Ecke

Datenbanken - [Firebird 2.0] Anfängerproblem mit Transaktion


funcry - Mo 20.08.07 11:50
Titel: [Firebird 2.0] Anfängerproblem mit Transaktion
Ich habe zwei Anwendungen, die im ungünstigsten Fall beide gleichzeitig einen Datensatz ändern.

Da eine Benutzerinteraktion aufgrund des Einsatzgebietes nicht immer möglich ist, will ich, dass die Änderungen von dem, der zuletzt die Transaktion beendet, übernommen werden.

Beispiel:
User A ändert Datensatz 52, speichert aber noch nicht.
User B ändert Datensatz 52, speichert aber noch nicht.
User A schließt seine Transaktion ab.
User B schließt seine Transaktion ab.
Die Änderungen von User B überschreiben die Änderungen von User A.

Leider bekomme ich die Umsetzung nicht hin. Sobald der user B seine Transaktion beenden will, wird die Exception an der stelle query1.post ausgelöst: "deadlock: conflict with a concurrent update". Das ist ja auch soweit ok, und ist die erwartete Reaktion der Datenbank. Ich kann das ganze auch in einer try except Anweisung abfangen, aber als Anfänger kriege ich einfach nicht raus, wie ich danach die aktuell geänderten Daten meines TQuerys in die Datenbank bekomme, ohne (!!) dass der Anwender B seine Änderungen erneut eingeben muss. Es soll also vollautomatisch ablaufen.

Ich habe excact für diesen Test das Interbase Tutial nachprogrammiert:
http://www.dsdt.info/tutorials/interbase/?page=9

Ich kann heute abend gerne noch den Quelltext nachreichen, habe nur derzeit keine Zugriff darauf.


UGrohne - Mo 20.08.07 11:57

Du musst dazu einfach nur die Transaktionseinstellungen anpassen, sodass solche Konflikte ignoriert werden. Welche Komponenten verwendest Du?

Im Moment weiß ich gerade die Isolationsstufe nicht mehr, die Du verwenden musst, aber da kann bestimmt jemand anderes aushelfen ;) :oops:


funcry - Mo 20.08.07 12:40

Danke für den Hinweis.

Ich nutze Delphi 2005 mit den dort enthaltenen Komponenten:

TIBDataBase, TIBTransaction und TIBDataSet.


Amiga-Fan - Mo 20.08.07 16:39

du verwendest die Interbase-Komponenten von Codegear mit Firebird 2? Also Codegear unterstützt Firebird 2 nicht.

Du solltest auf ZEOS/IBDAC/FIBPLUS wechseln.


funcry - Mo 20.08.07 17:32

Danke Amiga-Fan für die Info, daran hatte ich garnicht gedacht. Würde alternativ auch Firebird 1.5 im Zusammenspiel mit den Codegear Komponenten funktionieren ?

Dank dem Hinweis von UGrohne denke ich, dass ich mit dem Modus "Read Comitted" + "no record_version" und "no wait" zusammen mit Commit Retaining zum Ziel kommen müsste, ich werde das heute zusammen mit Firebird 1.5 ausprobieren.


Amiga-Fan - Di 21.08.07 00:31

solange du keine administrativen Sachen wie Benutzer anlegen machst, ja. UIB gibt es da übrigens auch noch...


hansa - Di 21.08.07 01:43

Guck in der FIBPlus-Doku. Da ist genau das angesprochene Problem in 4 Kapiteln abgehandelt.


funcry - Di 21.08.07 12:53

Die Kombination von Firebird 1.5 und den genannten Transaktionseinstellungen funktioniert.

Dank der Hinweise aus dem Forum konnt ich auch zwei Artikel finden, die für mich recht verständlich die verschiedenen Transaktionsmodi erklärt haben.

Google: interbase wenn zwei sich streiten
Google: interbase maßlos