André Mantz: SQL: select und update in einem statement möglich?

Hallo,

ich frage mich, ob es in SQL (hier: MySQL 4.0.12) möglich ist, Daten aus einer Tabelle abzufragen und gleichzeitig den/die abgefragten Datensätze zu ändern/löschen?

Mein Problem besteht nämlich darin, eine Anwendung auf einem MySQL-Server laufen lassen zu müssen, auf dem ich kein Recht habe, Tabellen zu sperren. Somit kann ich nicht sicherstellen, dass zwischen einem select und einem darauffolgenden update (oder delete) nicht schon jemand anderes an dem Datensatz Änderungen vorgenommen hat.

Leider hat das MySQL-Handbuch mir da keine Lösung zu bieten können ... oder ich habe sie einfach nicht gefunden.

Danke für eure Hilfe.

Gruß, André

  1. abend,

    Mein Problem besteht nämlich darin, eine Anwendung auf einem MySQL-Server
    laufen lassen zu müssen, auf dem ich kein Recht habe, Tabellen zu sperren.
    Somit kann ich nicht sicherstellen, dass zwischen einem select und einem
    darauffolgenden update (oder delete) nicht schon jemand anderes an dem
    Datensatz Änderungen vorgenommen hat.

    unter mysql gibt es den tabellentyp innoDb, der von haus aus referenzielle
    integrietät unterstützt. somit lassen sich abhängige, so wie auch (AFAIK)
    gerade bearbeitende datensätze nicht so einfach löschen bzw. gar nicht
    löschen. das dürfte in deinem fall ja das passende sein..

    HIH

    mfg,
    (tanz das)
    Z.N.S.

    --
    <img src="http://www.dmp-web.de/comunicout/neubauten.gif" border="0" alt="">
  2. Hi,

    Leider hat das MySQL-Handbuch mir da keine Lösung zu bieten können ... oder ich habe sie einfach nicht gefunden.

    schau Dir mal die Syntax-Definition des SELECT-Statements genauer an (müsste Kapitel 13.1.7 sein). Dort taucht der Begriff "UPDATE" auf.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo

      schau Dir mal die Syntax-Definition des SELECT-Statements genauer an (müsste Kapitel 13.1.7 sein). Dort taucht der Begriff "UPDATE" auf.

      Also in meinem SQL-Manual gibt´s zwar kein Kapitel 13.1.7, aber in der Beschreibung von SELECT steht tatsächlich was von FOR UPDATE.

      Da steht: "Wenn Sie FOR UPDATE bei einem Tabellen-Handler mit Seiten-/Zeilen-Sperren benutzen, werden die untersuchten Zeilen schreib-gesperrt."

      Mehr leider nicht. Vielleicht kann mir jemand genaueres dazu sagen, wie ich das nun machen muß.

      Gruß, André

      P.S.: Ach ja, ich benutze das Online-Manual von www.mysql.de

      1. Hi,

        Da steht: "Wenn Sie FOR UPDATE bei einem Tabellen-Handler mit Seiten-/Zeilen-Sperren benutzen, werden die untersuchten Zeilen schreib-gesperrt."

        genau das wolltest Du doch, oder? :-) Anschließend aktualisierst Du sie, und fertig ist die Laube.

        Mehr leider nicht. Vielleicht kann mir jemand genaueres dazu sagen, wie ich das nun machen muß.

        In der Praxis habe ich MySQL noch nie wirklich verwendet, kann Dir also keine Erfahrungswerte liefern. Ich unterstelle aber, dass es sich hier nicht wesentlich von Oracle unterscheidet, deswegen rate ich Dir: Just do it. Es ist nichts Magisches dran.

        P.S.: Ach ja, ich benutze das Online-Manual von www.mysql.de

        Das Original befindet sich nach meinem Kenntnisstand auf mysql.com, und daher habe ich auch die Kapitelnummer. Möglicherweise ist mysql.de hier unterschiedlich.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Nochmal hallo,

          Da steht: "Wenn Sie FOR UPDATE bei einem Tabellen-Handler mit Seiten-/Zeilen-Sperren benutzen, werden die untersuchten Zeilen schreib-gesperrt."

          genau das wolltest Du doch, oder? :-) Anschließend aktualisierst Du sie, und fertig ist die Laube.

          Fertig ist die Laube? Das heißt, ich brauche mich um das Aufheben der Sperre nicht zu kümmern? Was ist, wenn ich mit dem Select mehrere Datensätze finde, aber nicht alle danach auch update? Dann würden die Sätze ja gesperrt bleiben, bis die sperrende Sitzung beendet ist ... oder?

          Fragen über fragen ...

          Ach ja, noch eine Frage: funktioniert SELECT ... FOR UPDATE auch mit MyISAM-Tabellen, oder brauche ich hierfür transaktionssichere Formate, wie z.B. innoDB?

          Nun ist aber gut mit Fragen. Leider ist die Handbuchversion von mysql.de in dieser Hinsicht sehr unübersichtlich und scheinbar werden viele dieser Fragen nicht erschöpfend behandelt.

          Gruß, André

          1. Hi,

            Fertig ist die Laube? Das heißt, ich brauche mich um das Aufheben der Sperre nicht zu kümmern?

            nicht, wenn Du Dich um das Bestätigen der Datenänderung kümmerst.

            Was ist, wenn ich mit dem Select mehrere Datensätze finde, aber nicht alle danach auch update? Dann würden die Sätze ja gesperrt bleiben, bis die sperrende Sitzung beendet ist ... oder?

            Genau wie wenn Du überhaupt nichts oder alle Datensätze änderst. Es geht um die Transaktion. Zitat aus der Doku: "If you use FOR UPDATE on a storage engine with page or row locks, the examined rows are write-locked until the end of the current transaction."

            Ach ja, noch eine Frage: funktioniert SELECT ... FOR UPDATE auch mit MyISAM-Tabellen, oder brauche ich hierfür transaktionssichere Formate, wie z.B. innoDB?

            Was tippst Du? ;-) Ohne Transaktion gibt es auch kein Ende einer solchen; zumindest keines, das nach dem Ende eines Statements liegen würde.

            Cheatah

            --
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes