Announcement

Collapse
No announcement yet.

MySQL Transaktionskonzept?!

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

  • MySQL Transaktionskonzept?!

    Hallo,

    ich habe zwei Tabellen in einer MySQL Datenbank. Die Engine ist InnoDB.

    Die Tabellen sind Benutzer und Adresse. Bnr ist in Adresse ein Fremdschlüssel bzgl. Benutzer. Also eine klassiche 1:n Beziehung. Ein Benutzer hat 0 oder mehrere Adressen.

    Wie trage ich nun 2 Datensätze (Ein neuer Benutzer mit einer Adresse) konsistent in einer MultiuserWEBanwendung ein?

    Damit die verknüpfung stimmt muss ich ja darauf achten, dass der Benutzer mit der bnr z.b. 3, in Adresse für seinen Datensatz dort auch die 3 steht.

    Ich arbeite mit mysqli und habe bisher nur inserts auf eine Tabelle gemacht.

    Vielen Dank

  • #2
    Hallo,

    Zuerst wird das Insert für den User-Datensatz durchgeführt. Wenn für den PK ein Autoincrement-Wert verwendet wird, dann läßt sich dieser mit LAST_INSERT_ID() direkt NACH dem Insert abfragen.
    Danach wird der zweite Insert mit dem Adress-Datensatz durchgeführt.
    Beide Inserts lassen sich bei Verwendung von InnoDB mittels START TRANSACTION / COMMIT | ROLLBACK kapseln.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Danke!

      würde ich dann einfach

      Pseudocode:

      mysqli(insert into benutzert values...)

      $bnr = mysqli(last_insert_id())

      mysqli(insert into adresse values(...$bnr...))

      ?!

      Muss ich hier das Isolationslevel verändern? und was passiert wenn nach dem ersten insert das script von einem anderen aufgerufen wird und dort das insert losgeschickt wird?

      Comment


      • #4
        Originally posted by gastgast View Post
        ...würde ich dann einfach

        Pseudocode:

        mysqli(insert into benutzert values...)

        $bnr = mysqli(last_insert_id())

        mysqli(insert into adresse values(...$bnr...))

        ?!
        Als Pseudocode würde ich sagen Ja!

        Originally posted by gastgast View Post
        ...und was passiert wenn nach dem ersten insert das script von einem anderen aufgerufen wird und dort das insert losgeschickt wird?
        The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.
        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Ich habe es mal rudimentär implementiert und es läuft auch.

          Gäbe es von den Anweisungen und dem Aufbau etwas zu verbessern?

          Klar ich würde es richtig in Funktionen usw kapseln, ich programmiere nach MVC Pattern

          Code:
          $sql = new mysqli("localhost","root","root","pinnwand");
          
          $qry = "insert into benutzer (name) values('franzzzzzzzzzzzsss')";
          
          $ps = $sql->prepare($qry);
          
          $ps->execute();
          			
          $ps->close();
          
          //------------------
          
          $qry = "select last_insert_id()";
          
          $ps = $sql->prepare($qry);
          
          $ps->bind_result($a);
          
          $ps->execute();
          
          $id = 0;
          
          while($ps->fetch()) { 
          	
          	$id = $a;
          	
          }
          
          $ps->close();
          
          echo $id."<br>";
          
          //----------
          
          $qry = "insert into adresse (title,bnr) values('xxxxx str.22 ',?)";
          
          $ps = $sql->prepare($qry);
          
          $ps->bind_param("i", $id);
          
          $ps->execute();
          			
          $ps->close();
          
          $sql->close();

          Comment

          Working...
          X