Hugo Egon Balder: MySQL: Tabellensperre während Zugriff

Hallo Forum,

ich habe mich heute wieder mal mit dem Thema Sperren von Dateien beschäftigt. Dazu habe ich jetzt folgende Frage:

Wie verhält es sich denn bzgl. Sperren bei einem Zugriff auf eine MySQL Datenbank?

Angenommen, ich habe eine php Ressource, in der gleich zu Beginn eine Verbindung zu einer Datenbank hergestellt wird. Dann folgt der ganze Code. Dabei werden zB. in Tabelle 1 neue Datensätze erstellt und in Tabelle 2 bestehende Datensätze verändert oder gelöscht. Am Ende des Skripts wird die verbindung zur Datenbank wieder geschlossen.

Wird hier seitens von SQL eine Sperre gesetzt? 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?

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.

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

MfG

Hugo Egon Balder

  1. 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.

    1. Hallo Dedlfix!

      Danke für die Erklärung!

      Aber Update x=x+1 ist problemlos möglich.

      Wußte gar nicht, dass man ohne vorheriges Auslesen Änderungen in einer Tabelle bewirken kann. Habe es getestet und es funktioniert einwandfrei!

      MfG

      Hugo Egon Balder