Lock-Möglichkeiten in verschiedenen MySQL-Versionen
Autor: Vilma Plum
eingetragen: Freitag, 24. Juni 2005 um 08:12 Uhr (25/2005 Kalenderwoche)
geändert: Freitag, 24. Juni 2005 um 08:12 Uhr (25/2005 Kalenderwoche)
Keywords: lock
Kategorien: DB: MySQL, DB: MariaDB,
Text:
Die Möglichkeit tables zu locken existiert schon in älteren versionen von MySQL. Mit dem Befehl LOCK TABLES tabellenname WRITE wird dieser table gesperrt für jeglichen Zurgiff von anderen threads, auch für blossen Lesezugrifff. READ sperrt die Lese-Zugriffe für alle threads. Freigegeben werden die tables durch sql-statement oder nach Beendigung des threads.
Werden von einem script mehrere threads aufgebaut (DB-Objekte mit unterschiedlichen usern und damit verbunden unterschiedlichen Rechten), so werdendiese threads unabhängig voneinander gehändelt. Dies ist bei verschachtelter Abarbeitung im script von Bedeutung. Sperrt das erste DB-Objekt den table FOO, so kann das zweite DB-Objekt nicht auf diesen table zugreifen, bevor das erste DB-Objekt eine Freigabe erteilt hat.
Greift das zweite DB-Objekt auf andere ungelockte tables zu, ist es i.d.R. erlaubt zumindest wenn das erste DB-Objekt select oder insert oder update ausführt. Wird dagegen ein delete ausgeführt vom ersten DB-Objekt, so muss vom zweiten DB-Objekt zunächst der genutzte table gesperrt werden, ansonsten meldet MySQL einen Fehler (table not locked) und führt den Process nicht aus.
Ab Version 4 bietet MySQL die Lock-Rechte in seinen priviliges-tablen an. Das heisst bei neueren Versionen müssen diese Rechte auch explizit vergeben werden, sonst scheitern die sql-statements an der Rechtevergabe.