Announcement

Collapse
No announcement yet.

Transaktionen und SP

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Transaktionen und SP

    Hey Leute,

    hab ein kleines Problem und zwar führe ich in einer "stored procedure" einige MySQL-Anweisungen aus und will nun, das egal bei welchem Fehler, alles innerhalb des Rumpfes der "stored procedure" wieder rückgängig gemacht wird.
    Versucht habe ich es so:

    Code:
    delimiter /
    CREATE PROCEDURE xxx (param1, param2, ...) SQL SECURITY INVOKER
    BEGIN
    SET AUTOCOMMIT=0;
    START TRANSACTION;
    <DIVERSE SQL-ANWEISUNGEN>
    COMMIT;
    SET AUTOCOMMIT=1;
    END;
    /
    delimiter ;

    Will aber leider nicht so wirklich funktionieren, d.h. falls mitten beim Ausführen des Rumpfes der "stored procedure" ein Fehler auftaucht werden die bereits innerhalb der "stored procedure" ausfgeführten Anweisungen nicht Rückgängig gemacht.
    Kann mir evtl einer von euch sagen, wie ich sowas schnell und einfach hinbekomme?

    Gruß und schönes Wochenende an alle :-)

  • #2
    Hast du mal Überprüft ob das AutoCommit auch wirklich ausgeschaltet wird?
    Schalte doch mal AutoCommit aus in deiner Procedure und lass mal nen Insert laufen ohne commit.

    Bei mir hat er das mal ne Zeit ignoriert und führt den Insert trotzdem aus.
    Hatte da auch mal sowas mit InnoDB. In der Workbench stand InnoDB als Default für Tabellen legte aber trotzdem MyIsam an.

    Nachtrag:
    Habe was interessantes gefunden im MySQL Handbuch

    Um den Autocommit-Modus für eine einzelne Abfolge von Anweisungen zu deaktivieren, verwenden Sie die Anweisung START TRANSACTION:

    START TRANSACTION;
    SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
    UPDATE table2 SET summary=@A WHERE type=1;
    COMMIT;

    Bei START TRANSACTION bleibt Autocommit deaktiviert, bis Sie die Transaktion mit COMMIT oder ROLLBACK beenden. Der Autocommit-Modus kehrt dann in seinen vorherigen Status zurück.

    Also bei mir haben beide Möglichkeiten funktioniert. Sicher das die Tabelle auch die InnoDB Engine verwendet und nicht MyISAM ?
    Zuletzt editiert von Vertax; 15.01.2011, 22:48.

    Comment


    • #3
      Danke für deine Hilfe :-)

      Das will leider überhaupt nicht funktionieren :-( Ich frühe wirklich INSERTS in der SP durch und selbst bei einem Test mit ROLLBACK am Ende wird trotzdem eingefügt

      Comment


      • #4
        Mhh und deine Tabelle ist auch sicher InnoDB und nicht MyISAM ? Weil eigentlich sollte es dann funktionieren.

        Comment


        • #5
          Hey,

          ja ziemlich sicher, die Fremdschlüsselbedingungen werden ja z.B. alle geprüft und in der Workbench zeigt der mir auch überall InnoDB an

          Comment


          • #6
            Mhh ok, dann kann ich dir leider auch nicht mehr weiterhelfen, ist schon sehr Misteriös

            Comment


            • #7
              Falls das ok ist, kannst du vllt mal deine SP hier posten mit den INSERTs?

              Comment


              • #8
                Lass mal das Set Autocommit weg dann sollte es gehn.

                [sql]-- --------------------------------------------------------------------------------
                -- Routine DDL
                -- --------------------------------------------------------------------------------
                DELIMITER $$

                CREATE DEFINER=`root`@`localhost` PROCEDURE `xxx`()
                SQL SECURITY INVOKER
                BEGIN
                Start Transaction;
                Insert Into test(test) Values(1);
                Insert Into test(test) Values(1);
                Insert Into test(test) Values(1);
                Insert Into test(test) Values(1);
                Insert Into test(test) Values(1);
                Insert Into test(test) Values(1);

                END
                [/sql]

                Comment


                • #9
                  Und wenn bei einen deiner INSERTs jetzt ein Fehler auftritt werden alle bereits durchgeführten INSERTS rückgängig gemacht? Bei mir will das nicht funktionieren :-(

                  Comment


                  • #10
                    Ja definitiv, habe in der test Tabelle das Attribut Test auf Unique gesetzt.
                    Deshalb Insertet er mir nur einmal die 1.

                    Wenn ich SQL Editor schliese und neu öffne, is die Tabelle wieder leer.

                    Comment


                    • #11
                      Höö du hast recht, man muss dafür den Editor einmal schließen, das habe ich vorher nie gemacht. Ist das ein Bug?

                      Comment

                      Working...
                      X