Weiter Zurück [Inhalt] Online Suche im Handbuch

28.20 LOCK/UNLOCK von TABELLEN

LOCK TABLES tbl_name [AS alias] {READ | [LOW_PRIORITY] WRITE}
            [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
LOCK TABLES sperrt eine ganze Tabelle für den Thread, also für den Prozeß, der gerade auf die Tabelle zugreift. UNLOCK TABLES entsperrt die Tabelle und gibt diese für andere Threads frei. Alle Tabellen, die gesperrt sind, werden automatisch entsperrt, wenn dieser Thread eine andere Tabelle sperrt, oder die Verbindung zum Server löst.

Wenn ein Thread eine READ Sperre setzt, dann kann dieser und alle andere Threads (!) nur aus dieser Tabelle lesen. Also merke: Ein WRITE Lock sperrt andere Threads für Lese-und Schreibvorgänge, ein READ Lock ermöglicht immer noch das Lesen für alle Threads.

Jeder Thread wartet solange auf seinen Einsatz, bis er alle angeforderten Locks auch zugewiesen bekommt (was lange dauern kann).

WRITE LOCKS haben normalerweise eine höhere Priorität vor READ LOCKS.

Damit wird sichergestellt, daß alle Updates so schnell wie möglich eingespielt werden, und die Clients (die eingebenden Personen) nicht mit unnötigen Wartezeiten zu kämpfen haben. Das bedeutet, daß wenn ein Thread einen READ LOCK zugewiesen bekommt, und ein anderer Thread einen WRITE LOCK angefordert, dann werden die Lesezugriffe solange zurückgestellt, bis der Thread den WRITE LOCK erhalten und seine Schreibprozesse beendet hat. WRITE LOCKS kann man aber auch in der Priorität zurücksetzen. Dies geschieht mit Hilfe der Option: LOW_PRIORITY WRITE.

Damit wird der Datenbankserver veranlaßt, nur in Lesepausen die Schreibvorgänge durchzuführen. Dies ist u.a. für Internet Anwendungen interessant. Es muß aber sichergestellt sein, daß es auch tatsächlich Pausen gibt, wo die Schreibvorgänge eingeschoben werden können.

Bei dem Einsatz des Befehls LOCK TABLES muß für alle Tabellen, die in einem Statement abgefragt werden, jeweils ein Lock gesetzt werden. Wenn also eine Tabelle mit mehrfachen ALIAS abgefragt wird, dann muß für jeden ALIAS ein LOCK gesetzt werden. Diese Vorgehensweise dient dazu, die Datenbank von DEADLOCKS freizuhalten.

Man sollte jedoch keinesfalls Tabellen mit einem WRITE LOCK belegen, wenn der Befehl INSER DELAYED verwendet wird. Hierzu muß man wissen, daß MySQL den INSERT Befehl einem neuen THREAD zuordnet.

Normalerweise ist ein Lock auf eine Tabelle bei einem einzelnen UPDATE Statement nicht notwendig. Der Grund liegt darin, daß Schreibvorgänge niemals mit Abfragevorgängen kollidieren können, da sie jeweils einen Thread zugewiesen bekommen. Es gibt nur ein paar wenige Fälle, bei denen Tabellen mit einem Lock gesperrt werden müssen, z.B. bei INSERT DELAYED, damit kein SELECT Statement zwischen zwei UPDATE Vorgängen eingeschoben werden kann. Dies würde zu Inkonsistenzen der Tabellen führen.

Merke: Bei der Änderung der Hierarchien von Lese-oder Schreibvorgängen mit ... DELAYED ...., oder durch Änderung der Hierarchie mit Parametern beim Start des mysqld Datenbank - Servers, müssen eventuell alle SELECT Statements mit LOCKS versehen werden !

Hier noch ein paar Beispiele zu Problemfällen:


Weiter Zurück [Inhalt] Online Suche im Handbuch