phpbar.de logo

Mailinglisten-Archive

[php] [OT] Lock Tables (MySQL) die richtigeLösung?

[php] [OT] Lock Tables (MySQL) die richtigeLösung?

David Molineus david at molineus.de
Don Mai 5 12:52:15 CEST 2005


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