Announcement

Collapse
No announcement yet.

Wert aus Stored Procedure wird nicht upgedated

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

  • Wert aus Stored Procedure wird nicht upgedated

    Hallo Leute,

    ich habe eine Anwendung, die von mehreren Anwendern benutzt wird.

    In dieser Anwendung gibt es eine RPC-Funktion, die unter bestimmten Bedingungen von einem Client ausgeführt wird.

    Im Regelfall läuft das Programm auf 3 Maschinen und im Durchschnitt kommt jede Maschine bei 3 RPC-Aufrufen 1mal zum Zug.

    Nun das Problem:
    Ändere ich in einer Anwendung für 1 Datenbankfeld nun einen Wert, so wird der Datenbankwert in diesem Client geändert. In der Firebird-Datenbank ist der Wert jedoch nicht upgedated, wie ich mit Hilfe von IBExpert sehen kann.

    Der Nachteil ist nun der, das abhängig vom Aufruf der RPC-Funktion der alte Wert bzw. der neue Wert zurückgeliefert wird.

    Erst wenn die Anwendung, die den Datensatz geändert hat, geschlossen wird, wird der Datensatz in die Firebird-Datenbank gespeichert. Vorher wird er anscheinend nur irgendwie "gepuffert".

    Was mache ich falsch und wie kann ich dieses Problem lösen ?

    Grüsse,
    Carsten

  • #2
    Hallo Carsten,

    grundsätzlich werden die daten für die anderen Benutzer erst nach einem Commit der Transaktion sichtbar. Wie die Situation nach dem erfolgten Commit aussieht hängt vom Isolationslevel der jeweiligen Transaction ab. Transactionslevel "Read Committed" - Anwender können die Änderung im Rahmen ihrer laufenden Transaction sehen. Bei den anderen zwei Transactionsleveln sind die Änderungen erst nach dem Start einer neuen Transaction sichtbar.

    Gruß

    Torste

    Comment


    • #3
      Hallo Torsten,

      danke erst einmal für Deine Einleitung. Aber ich glaube, ich habe das ganze Prinzip noch nicht so ganz verstanden.

      In meiner Anwendung habe ich als DefaultAction für die TIBTransaction-Komp. "TACommit" eingestellt.

      Die Transaktions-Eigenschaften für "Committed lesen" sind wie folgt deklariert:
      <PRE>
      read_committed
      rec_version
      nowait
      </PRE>

      Ich dachte, daß dieses "Commit"-Transaktions-Ereignis immer nach einem Speichern eines Datensatzes ausgeführt wird. Dies ist anscheinend aber nicht so.

      Wo muß ich jetzt genau anfangen, das Problem zu fixen ?

      Grüsse,
      Carste

      Comment


      • #4
        Hallo Carsten,

        ich arbeite mit IBObjects. Die IBX-Komponenten verwende ich bereits seit Jahren nicht mehr.

        Soweit ich das jetzt in der Kürze überblicken konnte wird die Default-Action immer ausgelöst werden der Idle-Timer auslöst. Falls der idle-Timer bei Dir auf 0 steht wird er nie ausgelöst.
        Der Idle-Timer soll sicherstellen das eine transaction nicht auf "immer und ewig" offen bleibt. Ansonsten scheint man bei den IBX-Combo's immer noch das transaktionshandling selber machen zu müssen. Also Transaktion starten und beenden.

        In der IBDataSet-Komponente gibt es das Event "OnAfterTransactionEnd". damit solltest Du mitbekommen können wann eine Transaction beendet (Commit/RollBack) wird.

        Gruß

        Torsten
        as Ereignisgibt es bei den IBX-Combo's kein Auto-Commit

        Comment


        • #5
          Hallo Torsten,

          Danke für Deine Fachkenntnisse. Bei mir stand Idle-Timer wirklich auf 0. Ich habe jetzt aber in dem Ereignis "AfterPost" der TIBDataSet-Komponenten folgende Zeilen hereingesetzt:
          <PRE>
          DM1.IBDataSet.Transaction.Commit;
          DM1.IBDataSet.Active:= True; // um meine Grid-Anzeige zu aktualisieren
          </PRE>

          Idle-Timer wollte ich nicht auf einen festgelegten Wert setzen, da ansonsten ja immer eine Transaktion ausgelöst wird nach einer gewissen Zeitspanne. Also unabhängig davon, ob ein Wert gespeichert werden soll oder nicht ? Liege ich da richtig in der Annahme ? Wenn ja, dann kostet dies doch unnötige Rechenzeit.

          Last but not least:
          Gibt es denn bei den IBObjects-Kompos ein Auto-Commit?

          Grüsse,
          Carste

          Comment


          • #6
            Hallo Carsten,

            Deine Annhame ist korrekt.

            Bei den IBObjects gibt es ein automtisches Transactionshandling und auch die Möglichkeit von AutoCommit.

            Wobei ich persönlich kein Freund von AutoCommit bin. Gerade bei DML-Statements will ich mich i.d.R. selber um die Transactionssteuerung kümmern.

            Gruß

            Torste

            Comment

            Working...
            X