Announcement

Collapse
No announcement yet.

Deadlock

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

  • Deadlock

    Liebe Forum Mitglieder,

    ich habe folgendes Dead-Lock Problem, welches ich nicht nachvollziehen kann:

    ausgangslage:

    tabelle
    Konto
    -id PK
    -txid FK von transaction

    tabelle
    transaction
    - id PK

    1. Deadlock entstehen unter last (ab 4 paralle Transactionen)

    wenn folgende zwei updates ausgeführt werden:

    upd1: "UPDATE Konto SET "+ "TXID = ? WHERE id = ?";
    (TXID ist ein id von Transaction)
    upd2: "UPDATE Transaction SET id = ?, tx_status = ?, amount = ?
    WHERE id = ?";


    2. Deadlock entstehen NICHT MEHR wenn ich die Reihenfolge der updates
    ändere, d.h erst Paymentransaction (upd2) dann Konto (upd1)

    3. Deadlock entstehen NICHT MEHR wenn ich die FK beziehung zwieschen
    Konto und Transaction deaktiviere.

    Viele Grüße
    Timor

  • #2
    Da gibt's ein Attribut bei Anlegen einer Tabelle wie viele ??? für konkurrierende Transaktionen auf einem Datenblock reserviert werden. Def ist 2 und max 256.

    Ich schau ob ich in der Doku was finde.

    Dies ist nur so ein Gedanke.

    Wann setzt Du dann das Commit bzw wie lange blieben die Transaktionen offen?

    lg Dietmar

    Comment


    • #3
      http://download.oracle.com/docs/cd/B...7.htm#g1058547

      Ist vielleicht nicht relevant, aber ein Versuch wert.

      lg Dietmar

      Comment


      • #4
        Danke Dietmar,

        commit passiert gleich hinterher, d.h. die Transactionen bleiben überhaupt nicht offen.
        Was mich wundert ist die Reihenfolge, obe es irgendwie mit master-slave relation zusammenhangt?
        Gruß
        Timor

        Comment


        • #5
          änderst du die TXID des Konto auf die neue id der transaction ?

          Comment


          • #6
            Ja. das mache ich.

            Comment


            • #7
              Das kann nicht funktionieren. Zwischen den beiden UPDATEs ist FK korrupt.
              Du musst erst den Kontosatz kopieren, dann das Update der Transaktionen und danach die alten Kontosätze löschen. Sonst zeigt der Fk der Transaktionen auf eine TXid, welche es nicht mehr gibt.

              Comment


              • #8
                Da hast Du recht, allerdings ich dachte solange noch nicht commited ist, kann nicht schifgehen.

                Ich denke wenn man die Reihenfolge geändert hat ist ausreichend für einer sauberen Tansaction. kontosatz zwischen kopieren ist überflüssig:
                tx.beginn
                upd2: "UPDATE Transaction SET id = ?, tx_status = ?,
                upd1: "UPDATE Konto SET "+ "TXID = ? WHERE id = ?";
                amount = ?
                WHERE id = ?";
                tx.commit

                Ich habe so gemacht und treten kein deadlock mehr auf. Allerdings wollte ich ja wissen warum deadlock entstehen.

                Comment


                • #9
                  Es sollte mich doch sehr wundern wen du keinen Fehler bekommst, nach dem ändern der Reihenfolge. Das Problem besteht ja auch dann noch.

                  ps. Das ist kein Deadlock, sondern eine Constraintverletzung.
                  http://de.wikipedia.org/wiki/Deadlock

                  Comment

                  Working...
                  X