Andi: Transaktionen und Abhängigkeiten

Hallo!

Ich möchte mehrere Tabellen gleichzeitig mit einem Datensatz befüllen und verwende dazu Transaktionen.
Was mache ich, wenn ein Datensatz in zwei Tabellen geschrieben wird, also mit zwei INSERTs und wenn der eine Eintrag vom anderen abhängt? Zum Beispiel wenn der Primärschlüssel in der ersten Tabelle dann in der zweiten Tabelle als Sekundärschlüssel verwendet werden soll?

Viele Grüße
Andi

  1. Hello,

    Was mache ich, wenn ein Datensatz in zwei Tabellen geschrieben wird, also mit zwei INSERTs und wenn der eine Eintrag vom anderen abhängt? Zum Beispiel wenn der Primärschlüssel in der ersten Tabelle dann in der zweiten Tabelle als Sekundärschlüssel verwendet werden soll?

    zugucken? Ne, im Ernst, wo ist das Problem? Füge erst den Satz mit dem Primärschlüssel ein, dann den mit dem Fremdschlüssel. Schlägt das zweite Insert fehl wird die Transaktion zurückgefahren und auch der erste Satz verschwindet - das ist der Sinn von Transaktionen.
    Falls du jetzt wissen willst, ob du innerhalb einer Transaktion auch kurzfristig gegen FOREIGN KEY Constraints verstoßen darfst - ähm, keine Ahnung, wäre möglich.

    MfG
    Rouven

    --
    -------------------
    Eine Bilanz ist wie der Bikini einer Frau. Sie zeigt fast alles, aber verdeckt das Wesentliche  --  Günter Stotz, Regierungsdirektor des baden-württembergischen Wirtschaftsministeriums
  2. hi,

    Ich möchte mehrere Tabellen gleichzeitig mit einem Datensatz befüllen und verwende dazu Transaktionen.
    Was mache ich, wenn ein Datensatz in zwei Tabellen geschrieben wird, also mit zwei INSERTs und wenn der eine Eintrag vom anderen abhängt? Zum Beispiel wenn der Primärschlüssel in der ersten Tabelle dann in der zweiten Tabelle als Sekundärschlüssel verwendet werden soll?

    Was du dann machst ist, erst mal klarer beschreiben, was du mit "was mache ich" eigentlich meinst.
    (Und dass du DBMS und Version noch erwähnst, ist uch selbstverständlich.)

    Weisst du nicht, wie du an die beim ersten Insert automatisch vergebene ID herankommst? Ja dann frag doch einfach danach ...

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Weisst du nicht, wie du an die beim ersten Insert automatisch vergebene ID herankommst? Ja dann frag doch einfach danach ...

      Ja, ich denke das ist es, was ich suche. DBMS ist MySQL.

      1. Hello,

        Ja, ich denke das ist es, was ich suche. DBMS ist MySQL.

        dann suchst du LAST_INSERT_ID()

        MfG
        Rouven

        --
        -------------------
        Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
        1. Hello,

          Ja, ich denke das ist es, was ich suche. DBMS ist MySQL.
          dann suchst du LAST_INSERT_ID()

          MfG
          Rouven

          Hallo!

          Ja, so etwas dachte ich mir. Es stellt sich nur die Frage, ob dieses Vorgehen so auch sicher ist? Eine Transaktion prüft ja letztendlich nur, ob das Einfügen zu einem Fehler führt. Es könnte dennoch passieren, dass während zwei Anfragen innerhalb einer Transaktion ein Dritter ein INSERT abschickt und dann die LASTID auf einen anderen, neueren Eintrag zeigt...

          1. Hello,

            Ja, so etwas dachte ich mir. Es stellt sich nur die Frage, ob dieses Vorgehen so auch sicher ist? Eine Transaktion prüft ja letztendlich nur, ob das Einfügen zu einem Fehler führt. Es könnte dennoch passieren, dass während zwei Anfragen innerhalb einer Transaktion ein Dritter ein INSERT abschickt und dann die LASTID auf einen anderen, neueren Eintrag zeigt...

            Nein, darüber haben sich schon vor dir Leute den Kopf zerbrochen, deswegen gilt LAST_INSERT_ID immer auf einer Verbindungsbasis - anderer Nutzer/Transaktion = andere Verbindung = andere ID.

            MfG
            Rouven

            --
            -------------------
            Ambition is the last refuge of failure.  --  Oscar Wilde (Irish Poet, Novelist, Dramatist and Critic, 1854-1900)
            1. Nein, darüber haben sich schon vor dir Leute den Kopf zerbrochen, deswegen gilt LAST_INSERT_ID immer auf einer Verbindungsbasis - anderer Nutzer/Transaktion = andere Verbindung = andere ID.

              Ziemlich gut, Danke!
              Eine letzte Frage hätte ich trotzdem noch:
              Was, wenn ich nicht den Primärschlüssel nehmen möchte, sondern nur den höchsten Wert (z.B. wenn ich Werte aus einer VIEW verwende):

              id_tabelle1 = (SELECT max(id)+1 FROM tabelle1)
              id_tabelle2 = (SELECT max(id)+1 FROM tabelle1)

              Macht das Sinn? Funktioniert das auch innerhalb einer Transaktion?

              Viele Grüße
              Andi

              1. Hello,

                Macht das Sinn? Funktioniert das auch innerhalb einer Transaktion?

                ok, damit wird's brutal. Das kommt jetzt sehr auf den Isolationslevel der Transaktion an, da müsste ich selbst tief ins Manual abtauchen, vgl Wikipedia:  Isolation Levels.

                MfG
                Rouven

                --
                -------------------
                He is entertaining both out of the car and in the car because if you tell him that a corner is almost flat then he is the guy who is going to try to take it flat even if it means shunting it the other side of it, he will come with the data and say 'hey, I may have crashed and destroyed the car, but I was flat-out'. That is an interesting quality that he has!  --  Team Member on Jacques Villeneuve
                1. Hello,

                  Macht das Sinn? Funktioniert das auch innerhalb einer Transaktion?
                  ok, damit wird's brutal. Das kommt jetzt sehr auf den Isolationslevel der Transaktion an, da müsste ich selbst tief ins Manual abtauchen, vgl Wikipedia:  Isolation Levels.

                  Super, Vielen Dank. So wie ich das sehe, wird in meinem Fall nur "Serializable" Sinn machen. Laut MySQL-Handbuch ist das auch bei InnoDB implementiert.
                  Sieht gut aus, ab hier versucht ich es ohne Schwimmflügel.
                  Vielen Dank nochmal!