Mailinglisten-Archive |
Solche Probleme entstehen oft aus dem Datenbankdesign heraus. Hier muss man sorgfältig prüfen, ob es nicht einfachere Schutzmechanismen gibt. Prinzipiell wäre im Beispiel die Frage zu stellen, ob den zwei Nutzer sich mit dem gleichen Nutzernamen überhaupt vollständig zeitgleich anmelden können. Ich halte den Fall für eher unwahrscheinlich. Bei hoher Nutzerzahl ist es wohl eher kritisch, die gesamte Tabelle zu LOCKen. Letztendlich wird aber jeder Request für sich abgehandelt. Also immer Formular nach Formular, soweit war deine Beobachtung richtig. Und die genauen Zeitpunkte sind nie feststellbar. Richtige Datenbanken (nicht MySQL) kennen dafür COMMIT/ROLLBACK TRANSACTION, mit denen sich solche Prozesse zusammenfassen lassen. In ASP kann man alternativ auch die Applikation (das Skript) locken. PHP / MySQL verzichtet darauf, um performanter zu sein, was ja auch gelungen ist. Also ist etwas mehr Kreativität gefragt, für solche Sachen. 1. Ansatz: Schreibvorgänge niedriger priorisieren: set SQL_LOW_PRIORITY_UPDATES=1 oder INSERT LOW_PRIORITY Dann haben die SELECTs immer Vorrang, was zumindest etwas das Gleichzeitigkeitsproblem löst. 2. Ansatz Tabelle LOCKen (aus Handbuch): mysql> LOCK TABLES trans READ, customer WRITE; mysql> select sum(value) from trans where customer_id= some_id; mysql> update customer set total_value=sum_from_previous_statement where customer_id=some_id; mysql> UNLOCK TABLES; WRITE verriegelt die Tabelle nur für Lese!- und Schreibvorgänge. Der nächste User wartet also, bis der letzte Schreibprozess abgeschlossen wurde. 3. Ansatz Lasse die gleichzeitige Eintragung zu und räume die DB ab und zu auf. Ich mache solche Garbage Collection mit einem Skript, das etwa alle 50 Aufrufe mal anspringt (per random). jörg -----Ursprüngliche Nachricht----- Von: Armin Steiner <steiner_(at)_dynamic-webpages.de> > Hi Liste, > [...] > > Nun musste ich gerade feststellen, das das (zumindest unter > Windows) anders läuft. Da gibts keine Ampeln. > Szenario: > Eingabe Formular, mittels dem man Kundendaten eingeben > soll. Mittles Abfrage wird überprüft, ob der Eintrag schon > vorhanden ist oder nicht (wenn ja: Fehler, wenn nein: OK) > Wenn man aber von zwei Rechnern im WindowsNetzwerk > gleichzeitig auf die DB zugreift, wird dieser Überprüfungs- > mechanismus ausgehebelt. Dann sind doppelte Einträge problemlos > möglich --- GRMBLE-GRRR!!! > > Sagt mir jetzt BITTE BITTE, das es sich um einen > Windows BUG handelt, das das alles unter UNIX nicht > passieren kann, weils da Ampeln gibt, ja ??! Bitte .... > > ... oder ansonsten - wenn ihr den Fehler/Bug/Problem kennt, > gebt mir nen Tipp .... > (Richtung LOCK??) > > DANKE:-) > > mit bestem Gruß > ... --- *** Abmelden von dieser Mailingliste funktioniert per E-Mail *** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe
php::bar PHP Wiki - Listenarchive