Autor Beitrag
jf_stgt
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 88



BeitragVerfasst: Fr 08.01.10 12:59 
Hallo zusammen,

in einem alten Projekt setze ich eine DB ein die keine Transaktionen unterstützt (DBF).
Beim speichern eines Einkaufs wird
a) Kopfsatz des Einkaufs
b) Details (bis zu 10) gespeichert
c) Artikelanzahkl modifiziert,
d) ...

Manchmal geht zwischendurch irgendwas schief und da bleiben natürlich "Leichen" übrig (teilweise sind Kopfsätze geschrieben, usw.).
In der alten DB gibt es noch keine Transaktionen. Denke das wäre der typische Anwendungsfall.
Habt ihr eine Idee wie man das am besten abfangen/lösen könnte?

Gruß
jf_stgt

PS.: Bitte nicht schreiben, ich solle die DB wechseln, dies geht leider aus anderen Gründen nicht.
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Fr 08.01.10 14:08 
Mein Vorschlag:
a) Eine Tabelle zur Verqwaltung von Transaktionsnummern (z.B. Start, Ende, Nummer, valide). Als Name schlage ich TransaktionTable vor)
b) Alle Änderung in eine separater Tabelle (zb. ChangeTable als Name) speichern. Die Strucktur z.B. Transaktionsnummer, betroffene Tabelle, betroffenens Feld, Typ des Feldes, alter Wert, neuer Wert, Typus der Änderung[Create,Modify,Delete])
c) in der Datenbank eine Funktionalität realisieren die alle Einträge einer Transaktion aus ChangeTabelle in die eigentlichen Tabellen schreibt.

Zugriff von außen (eventuell über einen Dienst/Schnitstelle oder ähnliches gekapselt):
lesen: direkt aus den Tabellen
schreiben:
a) Transaktionsnummer holen /öffnen
b) alle Änderungen in ChangeTable zwischen speichert
c) Transaktion schließen

Knackpunkt hierbei ist die Funktionalität welche die Daten aus Changetable in die Zieltabellen schreibt.
Diese muss sogestaltet sein dass bei einem Fehler alle möglicherweise geänderten Einträge auf die in der ChangeTable zwischen gespeicherten Altwerte zurückgesetzt werden. Hierbei die 2 Sonderfälle Erzeugen eines Datensatzes (kein alter Wert vorhanden) und Entfernen eines Datensatzes (kein neuer Wert vorhanden) beachten.

Wenn Du die ChangeTable nicht löscht hast Du auch ein Logging womit Du ausgehend von einem validen Stand alle Änderungen neu einspielen kannst. Dazu dürfte aber auch eine einfache Logdatei reichen.
jf_stgt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 88



BeitragVerfasst: Fr 08.01.10 14:56 
Danke!
Hört sich gut an!
user profile iconTilo hat folgendes geschrieben Zum zitierten Posting springen:
Knackpunkt hierbei ist die Funktionalität welche die Daten aus Changetable in die Zieltabellen schreibt.
Diese muss sogestaltet sein dass bei einem Fehler alle möglicherweise geänderten Einträge auf die in der ChangeTable zwischen gespeicherten Altwerte zurückgesetzt werden. Hierbei die 2 Sonderfälle Erzeugen eines Datensatzes (kein alter Wert vorhanden) und Entfernen eines Datensatzes (kein neuer Wert vorhanden) beachten.

Dies ist sicher der Knackpunkt. Würdest Du den "TransaktionsController" eher in einem separaten Thread machen oder in einem extra Dienst (ganz losgelöst von der Applikation)?

user profile iconTilo hat folgendes geschrieben Zum zitierten Posting springen:
Wenn Du die ChangeTable nicht löscht hast Du auch ein Logging womit Du ausgehend von einem validen Stand alle Änderungen neu einspielen kannst. Dazu dürfte aber auch eine einfache Logdatei reichen.

Dies bräuchte ich gar nicht unbedingt. Ich würde die Transaktionen eher wieder löschen wenn Sie abgeschlossen sind.

Alternativ könnte man ja auch direkt in die DB (richtige Tabelle) speichern (vorher den vorhandenen Inhalt auslesen) und nur über so eine Art Transaktion-Rollback für den Fall des Falles die Daten wiederherstellen.
Dann würde der "Transaktions-Controller" nur aktiv werden bei einem Rollback.

Gruß
jf_stgt
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Fr 08.01.10 20:45 
user profile iconjf_stgt hat folgendes geschrieben Zum zitierten Posting springen:

user profile iconTilo hat folgendes geschrieben Zum zitierten Posting springen:
Wenn Du die ChangeTable nicht löscht hast Du auch ein Logging womit Du ausgehend von einem validen Stand alle Änderungen neu einspielen kannst. Dazu dürfte aber auch eine einfache Logdatei reichen.

Dies bräuchte ich gar nicht unbedingt. Ich würde die Transaktionen eher wieder löschen wenn Sie abgeschlossen sind.

Alternativ könnte man ja auch direkt in die DB (richtige Tabelle) speichern (vorher den vorhandenen Inhalt auslesen) und nur über so eine Art Transaktion-Rollback für den Fall des Falles die Daten wiederherstellen.
Dann würde der "Transaktions-Controller" nur aktiv werden bei einem Rollback.

Gruß
jf_stgt


Da hast Du mich glaube ich etwas falsch verstanden. Das Logfile brauchst Du nur wenn Du ein automatisches Rollback nicht haben möchtest. Für die Transaktionskontrolle ist es besser die ChangeTable in der Datenbank anzulegen um bei einer verteilten Anwendung nicht auf jeden Client eine Logfile zu haben. Am sichersten ist es einen kleinen Server/Dienst/"TransaktionsController" als Schnittstelle zwischen der DB und den Clients zu schalten. Die Changetable wird dabei vom TransaktionsController(TC) vor den Client geheim gehalten und jeder Zugriff auf die DB geht nur über den TC. In dem Moment wo ein Client dem TC mitteilt die Transaktion zu beenden prüft der TC auf Korrektheit und schreibt die gewollten Änderungen fest.

So würde ich es zumindest versuchen. Die entgültige Designentscheidung liegt bei dir.