Ankündigung

Einklappen
Keine Ankündigung bisher.

mysqli insert_id mit transaction problem Verständnisfrage ?

Einklappen

Neue Werbung 2019

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

  • mysqli insert_id mit transaction problem Verständnisfrage ?

    Hallo,

    warum erhöht sich die Zahl des insert_id obwohl kein commit zustande kommt und in der Datenbank Tabelle nicht eingetragen wird??
    Beispiel, Zwei sql (inserts) queries und wenn beide erfolgreich sind wird der commit() ausgeführt.

    Wenn aber das Zweite nicht erfolgreich war, dann der rollback().
    $mysql->insert_id; von der Erste query entnommen.

    PHP-Code:
    $mysql->begin_transaction();

    $sql1 "insert ....";
    $x1 $mysql->query($sql1);
    $last_id $msql->insert_id;

    echo 
    $last_id;

    $sql2 "insert .... (...,'$last_id');";
    $x2 $mysql->query($sql1);

    If (
    $x1&&$x2){
        
    $mysql->commit();
    } else {
       throw new 
    Exception ($mysql->error);
    }
    ..... 
    Ich dachte insert_id bezieht sich auf das letzte eingetragen ID, was auch in der Datenbank tatsächlich steht.

    MFG c01001.
    Ob eine Sache gelingt, erfährst du nicht, wenn du darüber nachdenkst, sondern wenn du es ausprobierst.

  • #2
    Die ID wird nicht erst beim Commit erstellt. Ansonsten könntest du auch gar nicht auf eine insert_id() zugreifen. Denn welche ID soll die Funktion dann liefern, wenn es noch keine gäbe?

    Und da eine ID eindeutig sein muss, darf sie auch nicht wiederverwendet werden. Das gleiche gilt ja auch wenn du Datensätze löschst. Diese IDs sollten dann auch nicht mehr verwendet werden. Sobald einmal eine ID benutzt wird, ist sie vergeben.

    Kommentar


    • #3
      weil solch eine ID nur eines ist: unique. Nicht aber lückenfrei.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Zitat von hellbringer Beitrag anzeigen
        Die ID wird nicht erst beim Commit erstellt. Ansonsten könntest du auch gar nicht auf eine insert_id() zugreifen. Denn welche ID soll die Funktion dann liefern, wenn es noch keine gäbe?

        Und da eine ID eindeutig sein muss, darf sie auch nicht wiederverwendet werden. Das gleiche gilt ja auch wenn du Datensätze löschst. Diese IDs sollten dann auch nicht mehr verwendet werden. Sobald einmal eine ID benutzt wird, ist sie vergeben.
        Da hast du Recht, das die ID vor der commit erstellt wird, war auch nicht das Problem .
        Ich dachte nur das es temporär erstellt und nach dem commit eingetragen wird.

        Aber wie es aussieht wird eingetragen, dann nächsten sql query bearbeitet und bei einen commit ist es erfolgreich abgeschlossen (in der DB übernommen),
        und sonst rollback alle Einträge von vorher werden aus der Tabellen gelöscht.

        Aber danke nochmals.
        Ob eine Sache gelingt, erfährst du nicht, wenn du darüber nachdenkst, sondern wenn du es ausprobierst.

        Kommentar


        • #5
          Zitat von c01001 Beitrag anzeigen
          Da hast du Recht, das die ID vor der commit erstellt wird, war auch nicht das Problem .
          Ich dachte nur das es temporär erstellt und nach dem commit eingetragen wird.
          Wie soll das gehen? Angenommen du hast zwei Verbindungen offen.

          V1: INSERT -> bekommt ID 8
          V2: INSERT -> bekommt ID 9
          V2: COMMIT
          V1: ROLLBACK

          Also ID 8 wurde zurückgezogen und ID 9 wurde geschrieben. Der Auto-Increment steht jetzt bei 10. Würdest du den Auto-Increment auf 8 zurück setzen, gäbs spätestens einen Fehler, wenn er wieder bei 9 steht, da die ID in der Tabelle existiert.

          Kommentar

          Lädt...
          X