AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Transactionhandling bei Interbase - suche die beste Methode
Thema durchsuchen
Ansicht
Themen-Optionen

Transactionhandling bei Interbase - suche die beste Methode

Ein Thema von grips-net · begonnen am 3. Sep 2004 · letzter Beitrag vom 4. Sep 2004
Antwort Antwort
grips-net

Registriert seit: 3. Sep 2004
Ort: St. Wendel
50 Beiträge
 
#1

Transactionhandling bei Interbase - suche die beste Methode

  Alt 3. Sep 2004, 08:49
Hallo!

Ich habe eine kleine Anwendung, die Interbase als Datenbank nutzt und die im Netz verwendet wird.

Das folgende Problem ist klar:
Zitat:
Benutzer A bearbeitet Satz 11. Er ändert Feld "xxx".
Gleichzeitig bearbeitet Benutzer B den gleichen Satz. Er ändert das Feld "zzz".
Einer der beiden wird nun die Änderungen des jeweils anderen überschreiben. Dies sollte aber verhindert werden. Um dies zu verhindern habe ich die folgenden Möglichkeiten gefunden:

1. Schreibschutzfeld
Jede Tabelle erhält eine neue Spalte "Schreibschutz". Sobald ein Nutzer in den Edit-Moduls wechselt, wird dieses Feld mit einem bestimmten Wert gefüllt. Dies verhindert, dass ein weiterer Benutzer diesen gerade gesperrten Satz ebenfalls bearbeitet.
Diese Methode hat den Nachteil, dass z.B. bei einem Programmabsturz der Datensatz zunächst gesperrt bleibt. Es müssen hier also gewisse Sicherheitsmechanismen eingebaut werden. So ganz überzeugt mich diese Möglichkeit nicht.

2. Abgleich
Sobald ein Nutzer in den Edit-Modus wechselt, werden die Daten (z.B. in einem Array) lokal zwischengespeichert. Vor dem Speichern (UPDATE) wird der komplette Datensatz neu angefordert und mit den lokalen Daten verglichen. Haben sich in der Zwischenzeit Änderungen ergeben, wird der Benutzer darauf hingewiesen. Er kann nun entscheiden, ob er seine Änderungen verwirft, die Änderungen des anderen Nutzers überschreibt oder sogar die beiden Änderungen kombiniert.
Auch diese Möglichkeit hat wieder gewisse Fallen. Außerdem erfordert Sie einen recht hohen Programmieraufwand

Gibt es vielleicht eine andere - elegantere - Möglichkeit um mein Problem, vor dem sehr viele stehen dürften, möglichst einfach zu lösen? Wie habt ihr das Problem gelöst?

Danke für die Antworten....
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Transactionhandling bei Interbase - suche die beste Meth

  Alt 3. Sep 2004, 11:40
Eine ähnliche Diskussion gab es schon (nur mit anderer Datenbank):Wie richtig mit Transaktionen und ADO umgehen?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
grips-net

Registriert seit: 3. Sep 2004
Ort: St. Wendel
50 Beiträge
 
#3

Re: Transactionhandling bei Interbase - suche die beste Meth

  Alt 3. Sep 2004, 15:55
Nur zur Information: Habe eine - wie ich finde sinnvolle, konsistente und recht einfache Möglichkeit gefunden:

Sobald ein Benutzer einen Satz bearbeitet SELECT elefant FROM afrika wird eine Transaction gestartet und mit einem Fake-UPDATE nach dem Muster UPDATE afrika SET elefant=elefant WHERE id=:ID belegt.
Nun ist der Datensatz für alle anderen gesperrt. Das richtige Update UPDATE afrika SET elefant=dumbo WHERE id=:ID überschrtibt das Fake-Upadte. Ein Commit beendet die Transaction.

Diese Art der Problemlösung ist für mich konsistent und wohl im Sinne der Interbase-Entwickler.
Leider funktioniert ja bei Interbase das SELECT elefant FROM afrika FOR UPDATE nicht.


Grüße

Michael

P.S.: Danke für den Hinweis Bernhard. Diese Diskussion hatte ich nicht gefunden - wohl die falschen Suchbegriffe. Wirklich geholfen hätte sie auch nicht. Trotzdem Danke.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Transactionhandling bei Interbase - suche die beste Meth

  Alt 3. Sep 2004, 17:40
Diese Lösung ist jedoch sehr Server-Resourcen-Lastig, da ja für jeden bearbeiteten Datensatz eine Transaktion gestartet wird, welche evtl. über mehrer Stunden aktiv ist (Formular öffnen, Anschließend Mittagessen und nach Mittagessen bis 15:00 Uhr Besprechung). Und wenn das jetzt viele User machen ist die Datanbank entsprechend ausgelastet. Transaktionen sollten so kurz wie möglich dauern.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#5

Re: Transactionhandling bei Interbase - suche die beste Meth

  Alt 3. Sep 2004, 17:54
Hallo,

willst Du einfach nur das bearbeiten von einem Datensatz zweier User verhindern? Das regelt doch der Interbase alleine, must es im nur sagen.

Das kannst Du über die Transaktion-Eigenschaften deiner Transaktion einstellen.
  Mit Zitat antworten Zitat
grips-net

Registriert seit: 3. Sep 2004
Ort: St. Wendel
50 Beiträge
 
#6

Re: Transactionhandling bei Interbase - suche die beste Meth

  Alt 4. Sep 2004, 13:52
Das Problem ist ganz einfach zu beschreiben:

Es gibt eine Liste mit Einträgen (z.B. Adressen). Diese werden über SELECT * FROM adressen ausgelesen. Nun kann der Benutzer einen Eintrag auswählen und diesen in einer anderen, modalen FORM bearbeiten.

Dazu wird der Satz für diese Form neu angefordert. SELECT * FROM adressen WHERE id=:ID .

Leider gibt es in Interbase kein FOR UPDATE. Zumindest scheint es nicht zu funktionieren.
Denn nun kann ein anderer Benutzer ja den gleichen Satz öffnen.
Beide machen ihre Änderung und speichern ab:

UPDATE adressen SET aenderung="änderung" WHERE id=:ID Entweder überschreibt der, der zuletzt speichert die Änderungen des ersten oder - je nach Einstellung der Transaction - werden die Änderungen des zweiten nicht angenommen. Einer der beiden wird sich ärgern.

Schon beim Abrufen des Satzes für die Änderung muss dem zweiten Benutzer meiner Meinung nach mitgeteilt werden, dass sich der Datensatz gerade in Bearbeitung befindet. Dies mache ich eben durch den Versuch eines Pseudo-UPDATES das fehlschlägt, wenn eine andere Transaction den Datensatz in Bearbeitung hat.

@Bernhard: Inwiefern diese Methode den Server belastet muss ich jetzt testen. Daran hatte ich nicht gedacht. Hoffentlich schafft er es.

@Albi: Kennst du eine weitere Methode? Deine Nachfrage zielt nämlich genau ins Schwarze.


Danke schonmal...

Michael
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz