Wie sperrt man eine Datenbank?
Kalle_B
- datenbank
Hallöle,
Meine Datenbanken:
MySQL Version 3.23.58 Provider: internet24
MySQL Version 4.1.9-log Provider: Terions
jaa, die Testphase ist einfach, da bin ich allein auf der DB.
Mein Buchungsprogramm lief gerade
723 sec bei internet24,
20 sec bei Terions.
Und da könnten im Ernstfall weitere User Daten eingeben, die den Lauf stören und Fehler verursachen.
Also müsste ich die DB für andere User sperren.
Macht man das mit einer Extra-Tabelle?
Sperrung eintragen. Andere User könnten noch einen Verarbeitungslauf von xx Minuten haben. Also warten.
Wie weiss ich, dass kein User mehr zugreift?
Andere User rausschmeissen - wie?
Sperrung mit Zeit eintragen, und wenn keine Freigabe kommt (Programmabsturz), nach xx Minuten ist die Sperrung hinfällig?
Lieben Gruß, Kalle
Moin!
jaa, die Testphase ist einfach, da bin ich allein auf der DB.
Mein Buchungsprogramm lief gerade
723 sec bei internet24,
20 sec bei Terions.
Und da könnten im Ernstfall weitere User Daten eingeben, die den Lauf stören und Fehler verursachen.
20 Sekunden ist schon extrem viel. Was machst du da? Die Datenbank komplett exportieren und neu einlesen?
723 Sekunden ist inakzeptabel.
Ich glaube allerdings nicht, dass du allein auf der DB bist - oder hast du einen Root-Server?
Also müsste ich die DB für andere User sperren.
Nein, du mußt an der Performance arbeiten.
Datenbanken sind konstruiert, pseudo-parallele Zugriffe verarbeiten zu können. Manche Dinge benötigen auch tatsächlich viel Zeit - das Indizieren des SELFHTML-Forumarchivs für die neue Suche beispielsweise hat mehr als drei Tage benötigt.
Aber von sowas sprichst du nicht - oder bewegst du mehrere Gigabyte an Daten bzw. fragst dermaßen riesige Datenbanken ab?
- Sven Rautenberg
Moin!
20 Sekunden ist schon extrem viel. Was machst du da? Die Datenbank komplett exportieren und neu einlesen?
723 Sekunden ist inakzeptabel.
Es ist ein Buchungslauf für ein Forum. Die Testdaten stammen vom letzten Forum 2005. Dieses Jahr werden es wohl 20% mehr Daten sein.
Für 55 Aussteller mit ca. 150 Mitarbeitern und 480 Besucher (teilweise in Gruppen) liegen 6.700 Kontaktwünsche vor.
Es stehen 30 Slots (Zeitabschnitte) für Kontakte zur Verfügung. Für jeden Besucher und für jeden Aussteller ist ein "Stundenplan" zu erstellen, per PDF zu mailen und auszudrucken.
Diverse Randbedingungen:
Für alle 30 Slots soll zunächst mit Aussteller-Kollege 1 ein Termin gemacht werden. Dann wieder von vorn für Kollege 2. Ebenso für 3 und 4. Oder per Radiobutton nur für 1, nur für 2 ...
Die Selektion der Besucher- Arten (nur am 1., nur am 2. Tag anwesend) habe ich noch gar nicht realisiert, ebenso die Bevorzung von schwachen (wenig gefragten) Ausstellern.
Ich denke schon, dass mein SQL nicht optimal ist, da die DB-Version 3.23.58 etwa keine Sub-Selects zulässt.
Mehrere Schleifen sind ineinander geschachtelt und in der innersten Schleife wird bei jedem Durchgang ein (genau EIN) Gesprächspartner gesucht.
Soweit meine Antwort auf deine Frage.
Meine Frage nach Sperrung der Datenbank ist immer noch offen.
Kalle
Hello,
Meine Frage nach Sperrung der Datenbank ist immer noch offen.
Es müssen doch sicher nicht alle Tabellen gesperrt werden, sondern nur die für Dein jeweils aktives Query benötigten. Dann kann man mittels LOCK TABLES arbeiten.
Das kann man auch auf die Satzebene treiben, damit man das System nicht total blockiert.
Dann muss man aber auf sogenannte Deadlocks achten. Die dürfen nicht auftreten.
Die Technik mit den Sperren setzt aber voruas, dass alle Hüllfunktionen (also Deine PHP-Scripte) konsequent die Statusmeldungen des Systems abfragen und verarbeiten. Sonst können sehr schnell Buchungen verloren gehen oder, was wahscheinlich noch schlimmer ist, nur Teile davon.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
vielleicht ist auch dieser Link ganz interessant für Deine theoretischen Überlegungen:
http://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden
Ich grübel nochmal, wo ich wohl die "Anleitung zur Auflösung paralleler Prozesse" gelassen habe.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Moin!
Also müsste ich die DB für andere User sperren.
Nein, du mußt an der Performance arbeiten.
Das ALLEIN ist es nicht. Stell dir vor, ich habe einen Aussteller im Zugriff, für den ich jetzt im Slot 7 einen freien Besucher suche.
Sind wir uns einig, dass diese Suche, egal wie performant die SQL- Abfrage ist, eine UNBESTIMMTE Zeit dauert?
In dieser Zeit könnte ein anderer User per Handbuchung "meinem" Aussteller einen Termin verpasst haben. Er ist also nicht mehr frei, wenn ich einen passenden Besucher gefunden habe.
An das Chaos bei zwei "gleichzeitigen" Automatikläufen mag ich gar nicht denken.
Kalle
Hello,
dafür gibt es bei den Datenbanken für Erwachsene die Transaktionskontrolle.
Außerdem muss das Design der Anwendung entsprechend gewählt werden:
Strikte Aufteilung in Stammdaten, Abschlusspositionen und Bewegungsdaten.
Das führt dann dazu, dass man die gewünschten Ergebnisse möglichst immer durch ein einziges Query erhält. Dieses ist gegenüber anderen Querys atomar zu kapseln.
Zur Not muss man mehrere Queries durch Setzen einer Sperre binden.
Ich finde leider im Moment die ausführliche Beschreibung nicht...
Aber hier wird es auch angedeutet, wie man das erreichen kann:
http://de.wikipedia.org/wiki/Transaktion_(Informatik)
speziell:
http://de.wikipedia.org/wiki/Gerichteter_Graph
Hierbei geht es darum, die Zusammenhänge (grafisch) so darzustellen, dass man erkennen kann, ob eine Vorgangskette (ein Zyklus) linear abgeschlossen bleibt, also nicht von anderen Ereignissen unterbrochen wird.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
dafür gibt es bei den Datenbanken für Erwachsene die Transaktionskontrolle.
Ja, kenn' ich doch von Oracle. Aber http://dev.mysql.com/transmit => Fehlanzeige. Also muss ich es von Hand basteln. Und das klingt schon etwas nach Kindergarten.
Heute war wieder Gespräch mit meinem Kunden. Ich suche jetzt also einen Provider, der PHP 5 und MySQL 5 bietet. Die Zitterei mit den Versionen 3 wird nicht akzeptiert.
Lieben Gruß, Kalle
Hello,
Heute war wieder Gespräch mit meinem Kunden. Ich suche jetzt also einen Provider, der PHP 5 und MySQL 5 bietet. Die Zitterei mit den Versionen 3 wird nicht akzeptiert.
Hast Du denn den Support bei Terions mal gefragt?
Die machen eigentlich alles, was geht.
Zur Not kostet es eben einmal extra Geld.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom