[EDIT]: Verständnisfrage: verstehe ich LOCK TABLES so richtig, dass dabei die ganze Tabelle gesperrt wird und die anderen Anfragen hinten anstehen und NICHT weggeworfen werden? Also auch keine Fehlermeldung kommt, weil er es von selbst in ein paar (Micro)Sekunden wieder probiert?
Hallo zusammen,
ich habe eine mysql-PHP-Anwendung.
Die Datenbank ist MySQL 5.6, MyISAM-Tabellen.
Auf die Anwendung können ca. 100.000 User aufteilt auf 20 Firmen (a max. 12.000 User) gleichzeitig zugreifen.
Die Anwendung ist ein Formular, in das die Kunden sich einloggen, Ihre Daten eingeben und abschicken.
Das geht nur 1x pro User - dann ist der Zugang für diesen User gesperrt.
Jede Firma hat 2 Tabellen. Eine mit den Kundendaten (max. 12.000 Einträge) und eine für die neu eingegebenen Daten der Kunden (max. 4.000 Einträge am Ende).
Es gibt eine Tabelle, in der ich alle Logins speichere (erfolgreich oder nicht) und die via Update mit der insert-ID aus der Datentabelle versorgt wird.
Und noch eine Tabelle für die Sessions. Der Session-Handler ist eine PHP-Class aus dem Netz, welche die Sessions auf die MySQL-DB umstellt.
Jetzt hatte ich bei einer Überprüfung das Problem, dass zwar korrekte Logins in der Login-Tabelle waren (insert-ID=0), aber keine dazugehörigen Dateneinträge in der Daten-Tabelle.
Mal abgesehen von dem Fall, dass der Kunde sich korrekt einloggt, dann aber das Formular vor dem Absenden verlässt - an was kann es sonst liegen?
Meine Vermutung geht dahin, dass wohl zwei oder mehrere Zugriffe auf die Datenbank / Tabelle zur gleichen Zeit waren und somit nur einer der Einträge gespeichert wurde.
1. Wie stelle ich das (im Laufenden Betrieb!) fest? Wie kann ich das nachprüfen, dass das das Problem war?
2. Wie kann ich es verhindern?
3. Kann ich MySQL (via PHP) anweisen, dass es bei erfolglosem speichern eine kleine Schleife durchläuft, bis die DB wieder ansprechbar ist?
4. Hilft mir hier ein Lock Tables? Ich hab das so verstanden, dass es a) nur was bringt, wenn man an mehrere Tabellen gleichzeitig was ändert und was konsistent bleiben muss und b) während eines Locks andere Abfragen ins Leere laufen - wie kann ich das dann abfangen in meiner Anwendung - am besten so, dass es der User nicht mitbekommt und seine Daten dennoch gespeichert werden? (Zwischenspeicher? Schleife?)
Dazu muss ich noch sagen:
Der Eintrag in die Datentabelle und das Update der Login-Tabelle geschehen zum gleichen Zeitpunkt (logisch).
Die Abfragen passieren über PHP mit PDO und (meist) mit prepared Statements.
Ich habe eine PHP-Datei (als index.php sozusagen), die alles händelt.
Darin ist auch der Aufruf bzw. die Verbindung zur Datenbank drin.
Diesen DB-Handler übergebe ich bei allen Funktionen mit, die eine Abfrage an die MySQL-DB senden wollen.
Vielleicht kann mir jemand weiterhelfen oder den entscheidenden Tipp geben.
Im Laufenden Betrieb kann ich leider keine größeren Tests oder Änderungen vornehmen, da ja sonst Einträge der Kunden ins Leere laufen.
Code-Snippets auf Anfrage möglich. Müsst mir nur sagen, welche Stellen genau. Ich kann nur schlecht meinen kompletten Quellcode hier posten.
Danke schon mal...
Hallo zusammen,
ich habe eine mysql-PHP-Anwendung.
Die Datenbank ist MySQL 5.6, MyISAM-Tabellen.
Auf die Anwendung können ca. 100.000 User aufteilt auf 20 Firmen (a max. 12.000 User) gleichzeitig zugreifen.
Die Anwendung ist ein Formular, in das die Kunden sich einloggen, Ihre Daten eingeben und abschicken.
Das geht nur 1x pro User - dann ist der Zugang für diesen User gesperrt.
Jede Firma hat 2 Tabellen. Eine mit den Kundendaten (max. 12.000 Einträge) und eine für die neu eingegebenen Daten der Kunden (max. 4.000 Einträge am Ende).
Es gibt eine Tabelle, in der ich alle Logins speichere (erfolgreich oder nicht) und die via Update mit der insert-ID aus der Datentabelle versorgt wird.
Und noch eine Tabelle für die Sessions. Der Session-Handler ist eine PHP-Class aus dem Netz, welche die Sessions auf die MySQL-DB umstellt.
Jetzt hatte ich bei einer Überprüfung das Problem, dass zwar korrekte Logins in der Login-Tabelle waren (insert-ID=0), aber keine dazugehörigen Dateneinträge in der Daten-Tabelle.
Mal abgesehen von dem Fall, dass der Kunde sich korrekt einloggt, dann aber das Formular vor dem Absenden verlässt - an was kann es sonst liegen?
Meine Vermutung geht dahin, dass wohl zwei oder mehrere Zugriffe auf die Datenbank / Tabelle zur gleichen Zeit waren und somit nur einer der Einträge gespeichert wurde.
1. Wie stelle ich das (im Laufenden Betrieb!) fest? Wie kann ich das nachprüfen, dass das das Problem war?
2. Wie kann ich es verhindern?
3. Kann ich MySQL (via PHP) anweisen, dass es bei erfolglosem speichern eine kleine Schleife durchläuft, bis die DB wieder ansprechbar ist?
4. Hilft mir hier ein Lock Tables? Ich hab das so verstanden, dass es a) nur was bringt, wenn man an mehrere Tabellen gleichzeitig was ändert und was konsistent bleiben muss und b) während eines Locks andere Abfragen ins Leere laufen - wie kann ich das dann abfangen in meiner Anwendung - am besten so, dass es der User nicht mitbekommt und seine Daten dennoch gespeichert werden? (Zwischenspeicher? Schleife?)
Dazu muss ich noch sagen:
Der Eintrag in die Datentabelle und das Update der Login-Tabelle geschehen zum gleichen Zeitpunkt (logisch).
Die Abfragen passieren über PHP mit PDO und (meist) mit prepared Statements.
Ich habe eine PHP-Datei (als index.php sozusagen), die alles händelt.
Darin ist auch der Aufruf bzw. die Verbindung zur Datenbank drin.
Diesen DB-Handler übergebe ich bei allen Funktionen mit, die eine Abfrage an die MySQL-DB senden wollen.
Vielleicht kann mir jemand weiterhelfen oder den entscheidenden Tipp geben.
Im Laufenden Betrieb kann ich leider keine größeren Tests oder Änderungen vornehmen, da ja sonst Einträge der Kunden ins Leere laufen.
Code-Snippets auf Anfrage möglich. Müsst mir nur sagen, welche Stellen genau. Ich kann nur schlecht meinen kompletten Quellcode hier posten.
Danke schon mal...
Kommentar