Chris©: MySQL und Stored Procedures und Functions

Hallo Forum,

wir beschäftigen uns seit Tagen um die Wette mit Stored Procedures und Funktions in MySQL.

Nun besteht die Frage, ob zwei Statements in einer Stored Procedure automatisch gebunden sind, oder ob man die Bindung zu einem atomaren Statement erst irgendeiner Maßnahme herstellen muss.

Als Übungsaufgabe haben wir das beliebte Thema "benutzerdefinierte sortierte Ausgabe" genommen. Die Funktionen sind überschaubar, was zum Üben nicht unwichtig ist.

Es gibt bisher die Funktionen bzw. Prozeduren BubbleUp() und BubbleDn(), um einen Datensatz in der Sortierung einen Platz nach oben oder nach unten zu verschieben. Die klappen auch gut, aber es besteht eben die Frage der Sicherheit.

BTW: wie heißt das, wenn man eine Zeitlücke zwischen zwei Statements erzeugt, die eigentlilch nicht sein darf?

Eben um diese Zeitlücke geht es.

Ich poste einfach mal die teile der Prozedur, um die es geht

set @b_id = <id des zu verschiebenden Satzes>

#nach oben rücken
    select a.id_zeit, lfd_nr into @a_id, @a_nr FROM zeit AS a where a.lfd_nr < (select @b_nr:= b.lfd_nr from zeit as b where b.id_zeit = @id) order by a.lfd_nr desc limit 1;
    select @a_id, @a_nr, @b_nr;

#nach unten rücken
    select a.id_zeit, lfd_nr into @a_id, @a_nr FROM zeit AS a where a.lfd_nr > (select @b_nr:= b.lfd_nr from zeit as b where b.id_zeit = @id) order by a.lfd_nr asc limit 1;
    select @a_id, @a_nr, @b_id, @b_nr;

#update ist für beide Richtugnen gleich
    update zeit
    set lfd_nr = if(lfd_nr = @b_nr, @a_nr, @b_nr)
    where lfd_nr in (@a_nr, @b_nr);
    select * from zeit order lfd_nr;

Wir haben versucht, die Selects und das Update in ein Statement zu bringen, aber das ist verboten, da die zu updatende Spalte abgefragt wird.

Nun müssen Selects udn Update irgendwie so zusammengeschweißt werden, dass da kein anderer Prozess dazwischenpasst. Wie muss man das machen?

LG
Chris©

  1. echo $begrüßung;

    Nun besteht die Frage, ob zwei Statements in einer Stored Procedure automatisch gebunden sind, oder ob man die Bindung zu einem atomaren Statement erst irgendeiner Maßnahme herstellen muss.

    BEGIN ... END Compound Statement Syntax: The optional [NOT] ATOMIC clause is not yet supported. This means that no transactional savepoint is set at the start of the instruction block and the BEGIN clause used in this context has no effect on the current transaction.

    Nun müssen Selects udn Update irgendwie so zusammengeschweißt werden, dass da kein anderer Prozess dazwischenpasst. Wie muss man das machen?

    Gemäß obiger Aussage bleiben wohl nur die üblichen Mittel übrig: MySQL Transactional and Locking Statements

    echo "$verabschiedung $name";

    1. Hallo Dedlfix,

      Nun müssen Selects udn Update irgendwie so zusammengeschweißt werden, dass da kein anderer Prozess dazwischenpasst. Wie muss man das machen?

      Gemäß obiger Aussage bleiben wohl nur die üblichen Mittel übrig: MySQL Transactional and Locking Statements

      Scheiße! (verzeih bitte die deutliche Sprache).

      Genau das Locking sollte nun endlich aus den ganzen Scripten verschwinden.
      Würdest Du hier Record-Locking empfehlen, oder die ganze Tabelle sperren bis zum Update?

      Meine Überlegeung dabei war, man kennt die zweite ID am Anfang nicht. Und man die Datensätze zu den IDs erst sperrt, wenn man die zweite ermittelt hat, kann es doch schon zu späte sein.

      Stimmt das?
      Dann bliebe nur, die ganze Tabelle zu sperren. Mit Transaktion kenn ich mich überhaupt noch nicht aus.

      LG
      Chris©

      1. echo $begrüßung;

        Würdest Du hier Record-Locking empfehlen, oder die ganze Tabelle sperren bis zum Update?

        Du überschätzt mich. Ich habe nur die passenden Stellen im Handbuch gesucht. Mehr kann ich zu dem Thema nicht beitragen.

        echo "$verabschiedung $name";

        1. Hallo Dedlfix,

          Würdest Du hier Record-Locking empfehlen, oder die ganze Tabelle sperren bis zum Update?

          Du überschätzt mich. Ich habe nur die passenden Stellen im Handbuch gesucht. Mehr kann ich zu dem Thema nicht beitragen.

          Du bist mir empfohlen worden ;-)

          jedenfalls hat mir Dein Zitat schon weitergeholfen. Ich habe es schon weitergegegeben an unsere kleine Offline-Community. Die haben auch alle wie aus einem Munde "Sch...." geschrien.

          Wir wollten nämlich unser Portal dadurch erheblich beschleunigen, dass wir aus den alten Skripten überall die MySQL-Zugriffe in Funktionen und Prozeduren verpacken, um dann das Tabellenlocking loswerden zu können und die "langen Wege" hin und her zwischen PHP-Skript und Datenbank beseitigen. Der Datenbankserver langweilt sich nämlich im Verhältnis zum Webserver. Der Webbi muss schließlich die ganze Darstellung und viele bunte Bilder berechnen.

          Naja, dann wird das heute wohl nix mehr. Transaktion kann ich nicht alleine. Werde ich mich nachher ins Kleine Schwarze schmeißen und mal wieder in die Stadt fahren.

          Bis morgen dann.

          LG
          Chris©