dedlfix: MySQL: Tabellensperre während Zugriff

Beitrag lesen

Tach!

Wird hier seitens von SQL eine Sperre gesetzt?

Ja. Aber nicht SQL, die Sprache, sondern MySQL, das konkrete DBMS. Andere DBMSe können sich durchaus unterschiedlich verhalten.

Und wenn ja - Was für Art von Sperre? Eine Sperre während des gesamten Skripts auf die gesamte DB, oder nur Sperren auf Tabelle 1 und 2. Nur Schreib- oder auch Leseschutz?

Kommt ganz drauf an. Das Thema ist nicht mit einer ganz kurzen Antwort zu beantworten. Eine komplette Sperre von Verbindungsaufbau bis -ende ist es auf keinen Fall. PHP im Webserver ist nicht das einzige Anwendungsfeld von MySQL. Verbindungen können durchaus auch ewig offen bleiben.

Nehmen wir als primitivstes Beispiel einen Counter, der in einer Tabelle den Zählerstand speichert. Hier kämen doch ohne Sperren evt. falsche Zählergebnisse heraus.

Das kommt ganz drauf an, wie du das realisierst. Abfragen, erhöhen und dann Updaten ist der falsche Weg, weil da tatsächlich Nebenläufigkeitsprobleme auftreten können. Aber Update x=x+1 ist problemlos möglich.

Ich habe zu dem Thema im Internet keine Infos gefunden. Ich bitte deshalb hier um Info und Aufklärung!

Das MySQL-Handbuch hat dazu Informationen. Du findest sie bei den Beschreibungen der Storage Engines, denn die verhalten sich was Sperren anbelangt durchaus unterschiedlich. InnoDB kennt beispielsweise Transaktionen, die andere Anforderungen haben als die sofort ausführenden Engines (wie MyISAM).

Um das Äquivalent zu Dateisperren - also dass Daten an und für sich sicher geschrieben werden - kümmert sich MySQL selbst. Du brauchst nur dann eigenen Sperren, wenn du keine Transaktion verwenden kannst und es aus Sicht deiner Anwendung unvermeidbar ist, komplexe Operationen auf mehrere Statements aufzuteilen.

dedlfix.