zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Datenbank Verständnis Problem

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 24.07.2011, 19:45
Benutzerbild von laborix
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 11.12.2005
Beiträge: 1.494
laborix ist ein sehr geschätzer Menschlaborix ist ein sehr geschätzer Menschlaborix ist ein sehr geschätzer Mensch
Standard Datenbank Verständnis Problem

Hallo miteinander,

irgendwie habe ich ein Brett vor dem Kopf

Fall 1:
Datenbank - zwei Benutzer lesen einen Datensatz aus und verändern diesen. Der eine geht erst mal einen Kaffee holen, der andere speichert seine Änderungen. Sieht der Kaffeetrinker noch die alten Daten in seinem Formular?

Fall 2:
Datenbank - zwei Benutzer lesen einen Datensatz aus und verändern diesen. Beide drücken zur gleichen Sekunde (Millisekunden eingerechnet) auf Speichern. Welcher der Änderungen liegt nun in der Datenbank?

Sollte man vor dem Speichern die eingelesenen Daten mit den aktuellen Daten in der Datenbank vergleichen?

Hintergrund: Locking Funktion, OK, Software (Qualität) abhängig . Kann mir da einer von euch etwas Licht ins Dunkel bringen?
__________________
Personal stuff
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 24.07.2011, 20:03
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.843
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Fall 1:

Der Kaffeetrinker sieht noch die alten Daten in seinem Formular und würde die Änderungen des anderen überschreiben, wenn er auf "Speichern klickt".

Fall 2:

Ist im Prinzip das gleiche wie Fall 1. Um's locking musst Du Dich erstmal nichts selbst kümmern, das erledigt die Datenbank. Das Locking ist ja erstmal nur dafür da, dass nicht zwei Schreibvorgänge parallel ausgeführt werden.

Natürlich lässt es sich somit erstmal grundsätzlich nicht vermeiden, dass 2 oder mehr Benutzer den selben Datensatz zum Bearbeiten laden und ggfs. Änderungen überschreiben.

Um dem Vorzubeugen könnte man entweder ein Flag in der Datenbank setzen, dass der Datensatz gerade bearbeitet wird, was aber irgendwie doof ist, falls der Benutzer einfach seinen Browser schließt, dann wird das Flag nicht zurückgenommen. Dies könnte man mit einem Timeout lösen, z.B., dass das Flag nach 5 Minuten nicht mehr gültig ist. Aber ggfs. ist der Datensatz dann für 5 Minuten für Änderungen gesperrt, was auch irgendwie doof ist.

Oder man könnte vor dem Speichern prüfen, ob sich die Datenlage geändert hat und dann die Daten versuchen zu mergen und/oder den Benutzer darüber informieren und fragen wie weiter vorgegangen werden soll. Ggfs. könnte man die gemergten Daten dann im Bearbeitungsformular anzeigen mit entsprechenden Hinweisen, bei welchen Feldern sich die Änderungen überschnitten haben und dann fragen, welche Änderungen denn nun genommen werden sollen.

Ist alles mit ein wenig Aufwand verbunden, weshalb ich das bisher noch nie so eingebaut habe. Die Wahrscheinlichkeit, dass 2 oder mehr Benutzer den gleichen Datensatz innerhalb der gleichen Zeit bearbeiten wollen ist relativ gering, auch wenn das durchaus vorkommen könnte.
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 24.07.2011, 20:03
Benutzerbild von Praktikant
Semantikbremse.
XHTMLforum-Kenner
 
Registriert seit: 22.04.2008
Beiträge: 4.985
Praktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz sein
Standard

Fall1: Der User sieht immer noch die alten Daten. Die Daten werden nicht verändert in dem Formular, da der Browser den Server auf Userwunsch nach den Daten fragt, nicht der Server dem User Bescheid sagt.

Als Lösung könntest du dem zweiten User Bescheid geben, dass bereits ein weiterer User die Daten bearbeitet.

Fall2: Der User der zuletzt schreibt, dessen Daten stehen in der Datenbank. Es können zwar beide zeitgleich absenden - es ist aber sehr unwahrscheinlich bei wenigen Usern - es kann aber immer nur einer schreiben. Der Datensatz wird vor dem Schreiben gesperrt.
Welcher von den beiden zuerst schreibt, ist aber nicht zu sagen.

Dabei hilft dann aber auch der Lösungsvorschlag von Nummer eins.

Einen Datensatz beim Abrufen zu sperren und nach dem Schreiben wieder freizugeben, ist nicht zu empfehlen. Es kann sein, dass der User seine Bearbeitung nie beendet...

Du kannst natürlich auch die alten mit den aktuellen Daten vergleichen, das kann aber Zeit in Anspruch nehmen

Edit: Ich sehe gerade mantiz war ein paar Sekunden schneller
__________________
Rettet die Erde.... sie ist der einzige Planet mit Schokolade!

Geändert von Praktikant (24.07.2011 um 20:10 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 24.07.2011, 21:29
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.843
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Zitat:
Zitat von Praktikant Beitrag anzeigen
Edit: Ich sehe gerade mantiz war ein paar Sekunden schneller
Gewonnen.

Aber tröste Dich, meistens ziehe ich dabei den Kürzeren.
Mit Zitat antworten
  #5 (permalink)  
Alt 24.07.2011, 21:40
Benutzerbild von inta
free as in freedom
XHTMLforum-Kenner
 
Registriert seit: 04.12.2006
Ort: Berlin
Beiträge: 5.016
inta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz sein
Standard

Ihr habt aber beide nur an Myisam & Co gedacht, das Mittel der Wahl um genau solche Probleme zu vermeiden sind Transaktionen. Wer also PostgreSQL oder Mysql mit InnoDB verwendet, kann Transaktionen nutzen und so würde der Kaffetrinker nicht die Daten des anderen überschreiben, sondern die Transaktion würde abgebrochen, zurückgerollt und er könnte einen hübschen Hinweis präsentiert bekommen, wo zum Beispiel seine Version mit der neuen aktuellen Verglichen verglichen wird. Im zweiten Fall würde auch nur eine Transaktion erfolgreich sein, die Zweite würde ebenfalls abgebrochen.
Mit Zitat antworten
  #6 (permalink)  
Alt 25.07.2011, 11:23
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.843
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Könntest Du das weiter ausführen?

Ich sehe nicht, dass Transaktionen hier helfen könnten, aber vielleicht bin ich im Moment einfach nur blind.

Mein Ansatz wäre das letzte Bearbeitungsdatum zum Datensatz zu speichern und dieses ebenfalls z.B. als Hidden-Field mit zu übertragen. Dann könnte man ein
Code:
UPDATE ... WHERE `id` = x AND `lastModified` = '...'
Dann kann man die Zahl der betroffenen Zeilen (mysql_affected_rows) auslesen und wenn man '0' erhält, fragt man den zu ändernden Datensatz nochmal ab, ob sich das Datum `lastModified` von dem mitgesendeten unterscheidet, falls ja, dann gab es ein Edit zwischendrin, falls nein, dann wurden einfach keine Daten geändert.

Und da es sich bei dem Update eigentlich nur um ein Statement handelt, sehe kein Einsatzgebiet für Transaktionen. Wenn das mit Transaktionen aber einfacher geht, dann klär' mich bitte auf, ich lerne gerne dazu.
Mit Zitat antworten
  #7 (permalink)  
Alt 25.07.2011, 16:46
Benutzerbild von inta
free as in freedom
XHTMLforum-Kenner
 
Registriert seit: 04.12.2006
Ort: Berlin
Beiträge: 5.016
inta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz sein
Standard

Zitat:
Zitat von mantiz Beitrag anzeigen
Könntest Du das weiter ausführen?

Ich sehe nicht, dass Transaktionen hier helfen könnten, aber vielleicht bin ich im Moment einfach nur blind.
Ich weiß nicht, was ich da genauer ausführen soll und warum Transaktionen hier nicht helfen sollten. Ich verweise einfach mal auf ein Beispiel in der PHP-Doku: PHP: Transaktionen und auto-commit - Manual. Hier passiert in etwa das was ihr beschrieben habt vollautomatisch, nach dem ACID-Prinzip wird die Atomarität, Konsistenz, Isolation und Dauerhaftigkeit der Daten gewährleistet, das heißt auch, dass seit dem Lesevorgang veränderte Daten nicht einfach überschrieben werden, in dem Fall würde eine Exception geworfen und ein Rollback ausgelöst.

Wenn alle Zugriffe auf die Datenbank mit Transaktionen erfolgen, dann kann es nicht zu dem Fall kommen, dass sich zwei Aktionen überschneiden. Die Transaktion die zuerst abgeschlossen wurde gewinnt, alle folgenden werden abgebrochen und zurückgerollt. Damit hat man eigentlich alle Probleme die es beim Zugriff geben kann erschlagen (abgesehen von Deadlocks). Ich habe das Gefühl, dass ihr genau dieses Verhalten versucht mit einer eigenen Lösung zu simulieren, oder sehe ich das falsch?
Mit Zitat antworten
  #8 (permalink)  
Alt 25.07.2011, 17:16
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.843
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Vielleicht reden wir auch aneinander vorbei.

Ich rede insbesondere von dem ersten Fall.

Der Ablauf ist ja z.B. wie folgt:

1. User A öffnet Datensatz A zum bearbeiten
2. User B öffnet Datensatz A zum bearbeiten
3. User B speichert Datensatz A
4. User A speichert Datensatz A

In Schritt 4 wird ja im Prinzip nur genau ein Statement (UPDATE ...) zur DB geschickt, ob dieses nun innerhalb einer Transaktion läuft oder nicht, ist doch völlig uninteressant, oder? So oder so würden die Daten von User B überschrieben werden, da Transaktionen nur innerhalb eines Scriptlaufs aktiv sein können.

Zitat:
Zitat von http://php.net/manual/de/pdo.transactions.php
Wenn das Script endet oder die Verbindung im Begriff ist, geschlossen zu werden und Sie eine Transaktion ausstehen haben, wird PDO automatisch einen Rollback durchführen. Dies ist eine Sicherheitsmaßnahme, um Inkonsistenzen in dem Fall, dass das Script unerwartet beendet wird, zu vermeiden - wenn Sie die Transaktion nicht explizit ausgeführt haben, wird angenommen, dass etwas schiefgegangen ist, deswegen wird zur Sicherheit Ihrer Daten ein Rollback durchgeführt.
Also selbst wenn alles innerhalb von Transaktionen ablaufen würde, hätte User A "gewonnen", wenn dieser seine Daten speichert. Ich sehe hier nur den Weg zu überprüfen, ob sich die Daten seit dem auslesen geändert haben, da es sich um unterschiedliche Requests handelt.
Mit Zitat antworten
  #9 (permalink)  
Alt 25.07.2011, 18:32
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 18.06.2007
Ort: Verden
Beiträge: 405
chorn wird schon bald berühmt werden
Standard

Du hast ja effektiv zwei oder mehr Zeitspannen vom Zeitpunkt des Aufrufs bis zum Zeitpunkt der Speicherung

Code:
---A-------------S------------
---------A--------------S-----

---A------------------S-------
---------A------S-------------
Und musst nun die Überschneidungen catchen, bzw du guckst, ob zwischen deinem Aufruf und deiner Speicheranfrage schon was gespeichert wurde.

Geändert von chorn (25.07.2011 um 18:35 Uhr)
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 25.07.2011, 19:52
Benutzerbild von laborix
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 11.12.2005
Beiträge: 1.494
laborix ist ein sehr geschätzer Menschlaborix ist ein sehr geschätzer Menschlaborix ist ein sehr geschätzer Mensch
Standard

Erst mal Danke, die Diskussion ist richtig gut.

Aber, wenn ich mir das so recht zusammen reime, dann komme ich zum Schluss, dass es eine Software Frage ist.

Folgerung:
Der Kaffeetrinker öffnet eine Anfrage an die Datenbank mit "exclusive" Zugriff. Erst jetzt übernimmt die Datenbank und verhindern ein Verändern der Daten, solange bis der Kaffeetrinker seinen Becher geleert (gespeichert) hat.

Fazit:
Die Software muss die Anfrage richtig stellen und alle Eventualitäten eines zweiten/dritten oder vierten Zurgriffs abfangen. Die Integrität der Daten übernimmt die Datenbank. Komplex wird das Ganze wahrscheinlich genau in dem Augenblick wenn mehrere Datentabellen voneinander abhängig sind, beziehungsweise die ganze Datenbank im "exclusive" Zugriff gesetzt werden muss. Sehr komplex das Ganze
__________________
Personal stuff
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit Text neben Navigationsleiste andi01 CSS 6 08.06.2011 17:54
HTML mit PHP Code aus Datenbank auslesen + ausführen Garlandt Serveradministration und serverseitige Scripte 14 01.05.2011 13:45
Mitwachsender Content und Footer Problem Bentham CSS 5 19.09.2010 12:49
IE 7: Zoom Problem, Höhen Problem, Text problem Cu Chullain CSS 4 02.09.2010 14:56
Problem mit Background-Color im FireFox to.ni CSS 2 31.08.2004 12:13


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:52 Uhr.