Announcement

Collapse
No announcement yet.

Insert oder update

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

  • Insert oder update

    Hallo! Bin gerade in der Vorbereitungsphase für eine Datenbank klausur . bei folgender aufgabe komm ich nicht mehr weiter, bitte um hilfe! vielen dank im voraus!

    In SQL hat man die Anweisungen INSERT und UPDATE. In einem Programm möchte man diesen Unterschied oft verbergen. Hat man etwa eine Klasse Kunde mit den Attributen KNr und KName, dann möchte man eine Methode save der Klasse Kunde zum Speichern von Objekten programmieren, die selbst überprüft ob in der Datenbank ein INSERT oder ein UPDATE nötig ist. Wir nehmen an, dass in der DB eine Tabelle Kunde mit den Feldern KNr (Primärschlüssel) KName angelegt ist. Neulich habe ich zu diesem Thema in einer Multiuser-Anwendung folgenden Code gesehen (vereinfachter Pseudocode)
    Pseudo code für Methode save der Klasse Kunde:

    Connection con=Driver Manager.getConnection(...);
    Statement stmt=con.createStatement();
    ResultSet rs=stmt.execute Query ( „SELECT Knr FROM Kunde WHERE Knr=“this.Knr);
    boolean found=
    ...wenn in rs die Knr gefunden wird, wird die Variable found auf true gesetzt
    if (found) {
    stmt.execute Update („Update Kunde set Kname=“ + this.kName + „WHERE Knr=“ + this.KNr);
    } else {
    stmt.execute Update („INSERT into Kunde values („ + this.KNr + „ ‚ ’“ + this.KName + „ ’ ) “);
    }con.Close();
    1. Worin besteht konzeptioneller Fehler im Vorgehen?
    2. Wie kann man das Vorgehen verbessern?

  • #2
    Worin besteht konzeptioneller Fehler im Vorgehen?
    Hier besteht die Gefahr eines sog. Lost Updates. Es wird keine Prüfung durchgeführt, ob sich der Datensatz seit dem initialen befüllen des Objektes geändert hat. Wäre dies der Fall, würde die Änderung jetzt ohne weiteres Aufhebens überschrieben werden. Wurde der datensatz zwischenzeitlich gelöscht verschindet die Änderung komplett. Sprich der User klickt auf speichern und bekommt keine weitere Meldung, dass jemand anders seinen Kunden in der Zwischenzeit gelöscht hat.

    Wie kann man das Vorgehen verbessern?
    Indem man entweder pessimistisches Locking (meistens nicht praktikabel) oder optimistisches Locking implementiert.

    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


    • #3
      hey! vielen dank für die schnelle antwort!

      sowas in der richtung hatte ich mir auch gedacht
      gruss,s.

      Comment


      • #4
        In NHibernate ist das z.B. so gelöst dass bei jedem Datensatz ein letztes Speicherdatum (oder eine laufende Nummer) mit dabei steht. Bei Update wird geprüft ob das Datum noch übereinstimmt.
        Nur wenn das Datum noch dem Datum des Datensatzes in der DB entspricht wird geupdatet, ansonsten bekommt man eine Exception.

        Comment

        Working...
        X