Autor Beitrag
funcry
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Mo 20.08.07 11:50 
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:
www.dsdt.info/tutorials/interbase/?page=9

Ich kann heute abend gerne noch den Quelltext nachreichen, habe nur derzeit keine Zugriff darauf.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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:


Zuletzt bearbeitet von UGrohne am Mo 20.08.07 13:16, insgesamt 1-mal bearbeitet
funcry Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: 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.

_________________
- Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
funcry Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: Di 21.08.07 00:31 
solange du keine administrativen Sachen wie Benutzer anlegen machst, ja. UIB gibt es da übrigens auch noch...

_________________
- Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 21.08.07 01:43 
Guck in der FIBPlus-Doku. Da ist genau das angesprochene Problem in 4 Kapiteln abgehandelt.

_________________
Gruß
Hansa
funcry Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: 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