Announcement

Collapse
No announcement yet.

Update-View-Inkonsistenz (MySQL oder anderes DBMS)

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

  • Update-View-Inkonsistenz (MySQL oder anderes DBMS)

    Hi,
    ich habe ein Problem mit folgendem Sachverhalt:
    Angenommen, es gibt eine Datenbasis (wie z.B. eine InnoDB-Tabelle) und zwei oder mehr unterschiedliche Benutzer b1...bn (bzw. Prozesse etc.) können gleichzeitig darauf zugreifen. Weiter angenommen, diese Datenbank befindet sich im Zustand z1, d.h. es sind beispielsweise die Datensätze A, B und C drin.

    Fragt der Benutzer b1 jetzt den Inhalt der Datenbasis ab (SELECT * FROM dbtab; ), so gibt ihm das DBMS laut oben gezeigten Beispiel A, B und C zurück.
    b1 arbeitet jetzt mit dieser Information, nennen wir sie eine "Sicht" (s1) - soweit so gut.

    Wenn nun b2 auf die Idee kommt, die Datenbasis in einen neuen Zustand z2 zu überführen, indem er beispielsweise den Datensatz B löscht, passiert was hässliches:
    Der Benutzer b1 mit seiner Sicht s1 arbeitet mit den Datensätzen A, B und C, obwohl B ja gelöscht ist, weil ihm keiner sagt, daß b2 den Zustand der Datenbasis geändert hat.

    Code:
    b1:    s1                                   s2
           ^                                    ^
           |                                    :
    Abfrage durch b1                  (!? keine Rückmeldung !?)
           |                                    :
           |                                    :
    db:    z1 --- Manipulation durch b2 ----->  z2
    Meine Frage:
    Gibt es eine Möglichkeit, MySQL beizubringen, dem Abonnenten (wie b1 im Beispiel) von Datensätzen eine Nachricht zu schicken, wenn Änderungen an den abonnierten Datensätzen in der Datenbasis passieren? (Oder hab ich bloß einen Denkfehler gemacht?) Gibt es andernfalls ein anderes Datenbanksystem als MySQL, welches dies unterstützt?

    Was ich nicht möchte, ist, den einzelnen Prozessen b1...bn oder Benutzern beibringen zu müssen,
    1. sich im Fall von Manipulationen an der Datenbasis selber gegenseitig Nachrichten zu schicken,
    2. ein paranoides Polling durchzuführen, das in kurzen zeitlichen Abständen prüft, die aktuelle Sicht noch konsistent mit dem aktuellen Datenbankzustand ist.

    Das oben gezeigte, ist vermutlich das einfachste Beispiel, um den Sachverhalt deutlich zu machen. Selbstverständlich gibt es auch sehr viel komplexere Szenarien in denen eine Lösung für dieses Problem gebraucht wird. In meinem konkreten Fall, möchte ich erreichen, daß ein Abonnent einer Teilmenge der Records der InnoDB-Tabelle A benachrichtigt wird, wenn Manipulationen an einer anderen InnoDB-Tabelle B (auch transitive Fortsetzung über mehrere Zwischenstufen ist möglich), die über eine Foreign-Key Verbindung (ON DELETE CASCADE/UPDATE etc.) verknüpft sind, durchgeführt wurden dies nötig machen.

    Man möge mir verzeihen, daß ich diesen Beitrag auch in anderen Foren anbringe, denn ich brauche dringend eine Antwort.

    Vielen herzlichen Dank für eure Antworten bereits vorab!
    Gruß
    Tom

  • #2
    http://dev.mysql.com/doc/refman/5.1/...-commands.html

    Üblicherweise ist ein Sperrkonzept eine Aufgabe der Anwendung die auf die DB zugreift.
    Christian

    Comment


    • #3
      Hallo,
      Originally posted by tomiondrums View Post
      ...Meine Frage:
      Gibt es eine Möglichkeit, MySQL beizubringen, dem Abonnenten (wie b1 im Beispiel) von Datensätzen eine Nachricht zu schicken, wenn Änderungen an den abonnierten Datensätzen in der Datenbasis passieren?
      Kurze Antwort: Nein! Dies ist auch nicht notwendig. Für die korrekte Behandlung der von dir beschriebenen Szenarien gibt es, wie von Christian schon erwähnt, die Transaktionssteuerung und entsprechende Sperrmechanismen. Wenn also b1 Daten abruft, um diese zu verändern, dann werden diese (ggfs. implizit durch die Transaktionssteuerung) gesperrt. b2 ist es dann solange nicht möglich die gleichen DS zu manipulieren, bis b1 seine Transaktion mit COMMIT festgeschrieben oder mit ROLLBACK verworfen hat.

      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


      • #4
        Der Tatsache, daß es Transaktionen gibt und daß man damit verhindern kann, daß jemand anderes die abgefragten Daten manipuliert, bin ich mir durchaus bewusst. Allerdings ginge das vollkommen an der Aufgabe vorbei, die ich damit lösen will.

        Mir gehts dabei primär darum, daß eine Liste von Einträgen einer Tabelle in meiner Anwendung permanent (!!) sichtbar und aktuell (d.h. mit der Datenbasis konsistent) bleiben muß. Wollte ich das auf die von euch vorgeschlagene Art und Weise lösen, wäre es zu keinem Zeitpunkt möglich, Datensätze hinzuzufügen, zu ändern oder zu löschen, genau das ist aber Zweck des Programms.
        ->Katze beißt sich in den Schwanz...

        Ein anderes Beispiel:
        Wenn jemand ein System baut, daß es einem Unternehmen ermöglicht, seine Aufträge elektronisch zu verwalten: Solange ein Mitarbeiter (und es soll ja schon vorgekommen sein, daß ein Unternehmen mehr als einen Mitarbeiter hat) sich die Liste der Aufträge ansieht, könnten dementsprechend keine neuen dazukommen. Ich gehe mal davon aus, daß dieses Unternehmen innerhalb kürzester Zeit pleite geht, sobald der Geschäftsführer auf die Idee kommt, hinsichtlich neuer Aufträge permanent auf dem Laufenden gehalten werden zu wollen. Man könnte jetzt im Gegenzug auf die Idee kommen dem Problem mit dem eingangs schon erwähnten paranoiden Polling (also jede Sekunde oder noch öfter eine neue Abfrage) zu lösen. Bei 20 Mitarbeitern und 50000 Klein- und Kleinstaufträgen bin ich mir sicher, daß das DBMS richtig Spaß haben wird. Mir ist schon klar, daß man da mit Timestamps und ganz viel schlimmen anderem Zeug rummachen kann, aber irgendwann wird der Aufwand für ein primitives Projekt so groß, daß sichs keiner mehr leisten kann und will und das alles nur weil irgendjemand mal gesagt hat, daß ein Datenbankserver nur mit dem Client redet, wenn der den Server auch ausdrücklich nach was gefragt hat.

        Ich weiß mittlerweile, daß man mit Oracle sogenannte Change Notifications einrichten kann und daß die aktuelle JDBC diese auch unterstützt. Sowas hätt ich auch gern für MySQL.

        Comment


        • #5
          Hallo,
          Originally posted by tomiondrums View Post
          ...Ich weiß mittlerweile, daß man mit Oracle sogenannte Change Notifications einrichten kann und daß die aktuelle JDBC diese auch unterstützt. Sowas hätt ich auch gern für MySQL.
          Da mußt du mit den MySQL-Entwicklern reden...
          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


          • #6
            Bei 20 Mitarbeitern und 50000 Klein- und Kleinstaufträgen bin ich mir sicher, daß das DBMS richtig Spaß haben wird.
            Ich kenn deine Abfragen nicht, aber diese Quantitäten ringen einem heutigen DBMS auf passender Hardware (also nicht der alte P4 aus dem Keller) im allgemeinen nur ein müdes Lächeln ab.

            Ich weiß mittlerweile, daß man mit Oracle sogenannte Change Notifications einrichten kann und daß die aktuelle JDBC diese auch unterstützt. Sowas hätt ich auch gern für MySQL.
            So etwas kannst Du dir auch mit überschaubarem Aufwand selbst bauen. In deiner Zugriffsschicht kannst Du z.B. per Messaging registrierte Clients benachrichtigen oder Du machst dir eine Tabelle mit nur einem Eintrag, der immer dann geändert wird, wenn sich die betreffenden Daten geändert haben (laufende Nummer). Dies kann z.B. auch per Trigger passieren.
            Diese Tabelle pollst Du dann z.B. alle 5 Sekunden und im fall der Fälle werden die anzuzeigenden Daten refreshed.

            Dim
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment


            • #7
              Hallo tomiondrums,

              wenn bestimmte Daten "immer" aktuell sein müssen, dann hilft derzeit nur in bestimmten Intervallen die Anfrage erneut zu stellen. Der Marktführer in Sachen DB ist da sicherlich etwas voraus. Mir ist auch nicht bekannt, dass man aus einer DB heraus z.B. einen Web-Service oder anderes Programm aufrufen könnte.

              Zum Problem:
              Wenn es viele Daten sind, die abgeglichen werden müssen kann man die Bearbeitungszeit indem man pro DB-Zeile (Datenupel) eine Hash-Summe bildet und diese in der DB-Zeile oder einer extra Tabelle (relevante Daten-Tabelle) ablegt. Im zyklischen Select fragt man mit "NOT IN (hash1, hash2, hash3...)" ab, welche Hashwert -> Datensätze (ID's) unbekannt sind. Somit weiss man, welche ID's man neu erfragen muss, oder man macht einfach einen Count und weiss bei "count > 0", dass man die Anzeige neu aufbauen muss.

              Schöne Grüße

              A. Fuss

              Comment


              • #8
                Originally posted by A. Fuss View Post
                .... Mir ist auch nicht bekannt, dass man aus einer DB heraus z.B. einen Web-Service oder anderes Programm aufrufen könnte.
                A. Fuss

                Nun, zumindest aus Oracle (PL(SQL) kannst du sowohl Webservices aufrufen als auch als Provider dienen :-)


                Gruss

                Comment


                • #9
                  Originally posted by tomiondrums View Post

                  Mir gehts dabei primär darum, daß eine Liste von Einträgen einer Tabelle in meiner Anwendung permanent (!!) sichtbar und aktuell (d.h. mit der Datenbasis konsistent) bleiben muß. Wollte ich das auf die von euch vorgeschlagene Art und Weise lösen, wäre es zu keinem Zeitpunkt möglich, Datensätze hinzuzufügen, zu ändern oder zu löschen, genau das ist aber Zweck des Programms.
                  Hallo,

                  Ich glaube, was du suchst, ist etwas in der Art wie Oracle AQ (Advanced Queing) resp. Oracle Streams). Inwieweit diese Technologieen in anderen Datenbanksystemen implementiert sind, entzieht sich meiner Kenntnis, aber i ch denke DB2 und / oder MS werden solche oder ähnliche Stacks ebenfalls implementiert haben


                  Grss


                  Gruss

                  Comment

                  Working...
                  X