Frage zu Transaktionen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Frage zu Transaktionen

    Hi,

    ich möchte Daten in verschiedene Tabellen schreiben, wobei z.B. die eingefügte Id aus der einen Tabelle in eine andere Tabelle geschrieben wird. Es muss sichergestellt werden das alle Abfragen erfolgreich sind und das eben die richtige zuletzt eingefügte ID eingetragen wird (nicht die eines anderen Schreibvorgangs in die Tabelle).
    sind dafür Transaktionen geeignet oder gibt es dazu andere Möglichkeiten? Ich muss ja dazu auf InnoDb umschalten. Gibt es größere Nachteile im Vergleich zu Myisam? (auch im Hinblick auf Geschwindigkeit, Joins)

  • #2
    Warum reicht dir mysql_insert_id() nicht?
    Oder das MySQL LAST_INSERT_ID()?
    Wir werden alle sterben

    Kommentar


    • #3
      Es sind ja mehrere Tabellen betroffen mit verschiedenen Insert-Statements. Wenn bei einer Abfrage etwas schiefgeht wird die Datenbank doch inkonsistent. Das wollte ich vermeiden. Wenn mehrere User zugleich Abfragen auslösen, ist denn dann auch immer sichergestellt, das mit mysql_insert_id() auch wirklich die richtige ID zurückgegeben wird?

      Kommentar


      • #4
        ist denn dann auch immer sichergestellt, das mit mysql_insert_id() auch wirklich die richtige ID zurückgegeben wird?
        Es gibt eine Ausnahme:
        mysql_insert_id() liefert 0, wenn die vorhergehende Abfrage keinen AUTO_INCREMENT Wert erzeugt hat.
        aus dem PHP Handbuch....

        Aus dem MySQL Handbuch:
        Die erzeugte Kennung wird auf dem Server verbindungsspezifisch gehandhabt: Der von der Funktion an einen bestimmten Client zurückgegebene Wert ist der erste AUTO_INCREMENT-Wert, der für die zuletzt abgesetzte Anweisung, die eine AUTO_INCREMENT-Spalte betraf, von diesem Client erzeugt wurde. Dieser Wert darf nicht von anderen Clients bearbeitet werden, auch wenn diese selbst AUTO_INCREMENT-Werte erzeugen. Dieses Verhalten gewährleistet, dass jeder Client seine eigene Kennung abrufen kann, ohne die Aktivitäten anderer Clients berücksichtigen oder Sperren setzen bzw. Transaktionen verwenden zu müssen.
        Und sicherlich sind Transaktionen zusätzlich sinnvoll bei Insert Kaskaden mit Abhängigkeiten..
        Zuletzt geändert von combie; 27.08.2010, 22:32.
        Wir werden alle sterben

        Kommentar


        • #5
          Ich habe im Netz gar nicht so viel zu den Transaktionen gefunden.
          Muss man denn nach jedem query prüfen ob ein Fehler aufgetreten ist oder kann man erst alles ausführen und dann einmalig schauen, ob es einen Fehler gab, also z.B.

          Code:
          Insert 1
          Insert 2
          
          if (fehler) rollback
          else commit

          Kommentar


          • #6
            Logik, einfach nur mal logisch denken....

            Warum würdest du nach einem fehlgeschlagenen Insert noch weitere absetzen wollen?
            Wozu?
            Welchen Sinn soll das haben?
            Wir werden alle sterben

            Kommentar


            • #7
              Natürlich will ich nach einem fehlegeschlagenen Insert keinen weiteren absetzen, das ja logisch.
              Ich hatte das auf Transaktionen bezogen, das wenn ein query fehlschlägt alles wieder zurückgesetzt wird ohne das ich nach jedem query prüfen muss.
              Deswegen hatte ich ja gefragt wie das mit den Transaktionen funktioniert.

              Kommentar


              • #8
                das wenn ein query fehlschlägt alles wieder zurückgesetzt wird ohne das ich nach jedem query prüfen muss.
                Automatisch?

                Die Anweisungen START TRANSACTION und BEGIN starten eine neue Transaktion. COMMIT übergibt die aktuelle Transaktion, macht also die entsprechenden Änderungen permanent. Mit ROLLBACK machen Sie die laufende Transaktion rückgängig, d. h., alle Änderungen werden zurückgenommen.
                Aus: MySQL :: MySQL 5.1 Referenzhandbuch :: 13.4.1 BEGIN/COMMIT/ROLLBACK

                Also, ich finde die Aussage im Handbuch recht eindeutig....
                Wir werden alle sterben

                Kommentar


                • #9
                  Hier werden die üblichen Fragen zu Transaktionen in MySQL beantwortet. Im Wesentlichen musst du START TRANSACTION bzw. BEGIN ausführen, gefolgt von deinen INSERT-Statements und dann entweder COMMIT oder ROLLBACK, abhängig davon ob die INSERTS zu deiner Zufriedenheit ausgeführt wurden.
                  Dabei ist zu beachten, dass MySQL nur dann automatisch die Transaktion abbricht und ROLLBACK macht, wenn Locking-Fehler auftreten. Sollte ein INSERT z.B. wegen Duplicate Key Entry fehlschlagen, macht MySQL einfach weiter. Du kannst aber mit
                  DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND ROLLBACK;
                  dafür sorgen, dass bei einem Fehler ein ROLLBACK ausgeführt wird. Willst du deine Applikation/PHP auch wissen lassen, dass wegen eines Fehlers abgebrochen wurde, solltest du
                  DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND BEGIN ROLLBACK; CALL ERROR_ROLLBACK_OCCURRED; END;
                  verwenden. Dieses Statement musst du natürlich vor deinen INSERTS absetzen.

                  Soweit die Theorie, wenn ich das Manual richtig verstanden habe. Ausprobiert habe ich das noch nie.

                  Kommentar

                  Lädt...
                  X