Teil 5: MySQL 4 - Einplanungsmodifikatoren und Locking

SQL-Optimierung: Manuelles Priorisieren und Sperren

Deadlocks

Allgemein ergibt sich daraus, dass Nebenläufigkeit bei Clients umso besser unterstützt wird, je niedriger die Sperrebene ist, denn umso mehr Clients können eine Tabelle gleichzeitig verwenden (sofern sie auf unterschiedliche Teile dieser Tabelle zugreifen). Praktisch ergibt sich daraus, dass verschiedene Tabellentypen unterschiedlich gut für verschiedene Anfragemischungen geeignet sind:

  • ISAM- und MyISAM-Tabellen sind beim Abrufen von Daten extrem schnell. Allerdings kann die Verwendung von Sperren auf Tabellenebene in Umgebungen mit gemischten Abruf- und Aktualisierungsaktionen zum Problem werden. Dies gilt insbesondere dann, wenn das Abrufen sehr zeitaufwändig ist; unter diesen Bedingungen kann es ziemlich lange dauern, bis Updates umgesetzt werden.

  • BDB- und InnoDB-Tabellen bieten eine bessere Performance, wenn Aktualisierungen häufig auftreten. Da die Sperre auf der Seiten- bzw. Zeilenebene erfolgt, ist der Teil der Tabelle, der vorübergehend nicht zugänglich ist, kleiner. Auf diese Weise werden Wartezeiten reduziert und gleichzeitige Verbindungen optimiert.

Die Sperre auf Tabellenebene hat einen Vorteil gegenüber den feinkörnigeren Sperrebenen, was die Verhinderung von Deadlocks angeht; diese können nämlich bei einer Tabellensperre gar nicht erst auftreten. Der Server bestimmt, welche Tabellen benötigt werden, indem er die Anfrage überprüft und alle betroffenen Tabellen umgehend sperrt. Bei InnoDB- und BDB-Tabellen können Deadlocks auftreten, weil die Handler nicht alle zu Beginn einer Transaktion benötigten Sperren vornehmen; stattdessen werden die Sperren umgesetzt, wenn sie während der Abarbeitung der Transaktion für notwendig befunden werden.

Es ist möglich, dass zwei Anfragen Sperren vornehmen und dann versuchen, weitere Sperren umzusetzen, die jedoch die Freigabe bereits gesperrter Elemente voraussetzen. Das bedeutet, dass jeder Client eine Sperre vorgenommen hat, die aufgehoben werden muss, damit der jeweils andere Client fortfahren kann. Dies ist eine Sackgasse, und der Server muss eine der Transaktionen abbrechen. Bei BDB-Tabellen können Sie die Entstehung solcher Deadlocks verhindern, indem Sie die Tabellensperre explizit mithilfe von LOCK TABLES vornehmen, denn der BDB-Handler verarbeitet solche Sperren. Bei InnoDB-Tabellen funktioniert das nicht, denn der Handler ignoriert Sperren, die mit LOCK TABLES gesetzt wurden.