Problem mit MySQL und 'Lock Tables'



  • Hallo,
    hier erst einmal meine Daten:

    Ich nutze ein Notebook (IP:192.168.0.5) auf dem MySQL v.5.0 läuft. Da gibt es auch eine Datenbank namens TestDB. Um diese DB zu bearbeiten nutze ich das Tool 'MySQL Administrator'. Das Notebook dient also als DB-Server.

    Dann gibt es noch einen Desktop-PC (IP:192.168.0.3). Beide Rechner sind mit einem Switch zu einem Netzwerk verbunden. Auf diesem PC nutze ich das Tool phpmyadmin.

    So, ich logge mich nun am PC mit der Adresse http://192.168.0.5/phpmyadmin auf dem Server ein. Ich kann nun diese Datenbank sehen und auch mit ihr arbeiten.

    Am Notebook starte ich nun "MySQL Administrator", logge mich als user 'Max' ein und kann die DB auch bearbeiten.

    Nun möchte ich ( user MAX) aber eine Tabelle sperren. Dazu gebe ich den Befehl

    LOCK TABLES t_adresse write
    

    ein. Ich bekomme auch KEINE Fehlermeldung!!!

    Jetzt mein Problem: Wenn ich nun als User 'root' vom Desktop-PC eine Abfrage auf diese Tabelle starte

    select * from t_adresse
    

    sollte ich doch eine Meldung bekommen, das diese Tabelle gesperrt ist. Leider wird diese Abfrage aber ausgeführt und ich sehe den Inhalt dieser Tabelle 😮
    Die Rechte, um eine Tabelle zu Sperren habe ich an den User MAX vergeben.

    Was mache ich denn Falsch???



  • Wofür willst du die sperren?.

    Wenn du auf einer Verbindung eine Tabelle sperrst dann wird diese sperre nach Beendigung der Verbindung wieder freigegeben.
    SChau dir in der Doku mal an was Lock Table genau macht denn da gibt es schreibsperren und schreib/lese sperren.



  • Wofür willst du die sperren?.

    Ich benötige die Tabellensperre dazu, um mit der Funktion 'LAST_INSERT_ID()' genau die ID zu bekommen die mein eingefügter DS hat. Es soll verhindert werden das ein weiterer User genau in dem Zeitraum zwischen meinem 'insert' und der Abfrage des 'LAST_INSERT_ID()' einen weiteren DS speichert.

    Und das verhindert man doch mit einer Tabellensperre.

    Ich habe auch in der Doku gelesen das eine 'write'-Sperre ein lesen/schreiben verhindern soll. Ich habe es dann auch damit versucht. Leider ohne Erfolg. Wenn ich am Laptop eine Sperre auf die Tabelle mit

    lock tables t_adresse write
    

    setze, kann ich direkt danach vom Desktop-PC eine Abfrage wie

    select * from t_adresse
    

    starten und bekomme auch eine Ergebnismenge. Und genau das sollte die Sperre doch auch verhindern, oder?



  • Wenn du in der gleichen Verbindung danach SELECT LASTINSERTID aufruft bekommst du deine eingefügte ID egal ob ein andere auch bereits eine eingefügt hat.
    IN der CAPI wird die ID sogar nach eine INSERT automatisch an die API übergeben ohne das es noch eine weitere abfrage bedarf. Das PHP z.B. die API verwendet ist dies dort auch so.
    Du brauchst also keine Lock Table machen wenn du eine Datensatz einfügst.



  • Wenn du in der gleichen Verbindung danach SELECT LASTINSERTID aufruft bekommst du deine eingefügte ID egal ob ein andere auch bereits eine eingefügt hat.

    OK, wenn dem so ist dann benötige ich ja doch kein LOCK TABLE.

    Aber die Frage die mich beschäftigt ist damit leider noch nicht beantwortet. Warum bekomme ich nach einem 'LOCK TABLES' dennoch eine Datenmenge zurück 🙄



  • doch habe es dir geschrieben. sie mein erstes Post


Anmelden zum Antworten