Mailinglisten-Archive |
Christoph Kramesch schrieb: >>1. Wird die Tabelle in einer Datenbankverbindung gesperrt, >>bekommt eine >>weiter zugreifende Verbindung dann eine Fehlermeldung, oder >>wartet MySql >>dann bis die Verbindung freigegeben wird und führt dann die nächste >>Anfrage durch? >> >> >Normalerweise passiert letzteres. > > Das ist gut. Alles andere wäre auch wenig sinnvoll. Da ich aber nichts in der Doku dazu gefunden hatte, hab ich lieber mal nachgefragt. >Das hängt ganz von den auf der Datenbank durgeführten Operationen ab! >In deinem Fall wird es wahrscheinlich so sein, daß du der Tabelle >beim einlesen einen Read Lock gibst, da ja aufgrund eventuell >durchzuführender Updates auch Lesezugriffe gesperrt werden sollen >(damit die anderen Prozesse dann bei der Updateüberprüfung den >aktuellesten >Datenstand haben). In diesem Fall muß darauf geachtet werden, >daß die Update routine sehr effizient arbeitet, damit die >Locktime der Tabelle gering bleibt... > > Ja, genau Lesezugriffe müssen auf alle Fälle gesperrt werden. War mir auch schon ziemlich sicher, dass der Write Lock das Richtige sein wird. >Normalerweise sollte bei normaler max_execution_time >die Wartezeit aber kein Problem ergeben, da es ja wahrscheinlich selten >vorkommt >das 50 Prozesse in des selben millisekunde zugreiffen... >Falls es sich um eine Tabelle mit sehr sehr hohen Zugriffszahlen >handelt, auf die massiv oft auch lesend zugregriffen wird, müsste >man sich allerdings andere Strategien einfallen lassen.. > > Das Problem ist halt nur, dass die Sperre nicht nur für die Abfrage durchgeführt werden muss, sondern für den gesamten Algorythmus. Das bedeutet, dass die Tabelle vor dem Auslesen *aller* Datensätze gesperrt werden muss. Ich rechne damit, dass es bei den Softwareeinträgen - die sollte die meisten Einträge beinhalten - in meinem Anwendungsfall ca. 200-300 Datensätze sein werden. Diese werden dann in einem Zyklus verglichen. Eventuell werden jetzt weitere Einträge eingefügt sowie ein Insert in die Relationstabelle mit allen Verbindungen durchgeführt. Ich habe die Zeit noch nicht gemessen, aber das sollten schon mehrere Millisekunden sein. Falls es wirklich problematisch werden sollte, habe ich schon einen anderen Lösungsansatz. Dabei speichere ich die Dateien erst einmal temporär in ein Verzeichnis und arbeite sie dann z.B. mit einem Cron-Job nacheinander ab. Da wäre das Problem behoben. Allerdings denke ich kaum, dass es aus der Sicht von den Leistungsanforderungen eines DBMS Sinn machen würde, wenn man für große Datenmengen so einen Umweg gehen muss. Vielen Dank für deine Antwort. Gruß, David
php::bar PHP Wiki - Listenarchive