Announcement

Collapse
No announcement yet.

Anwendung bleibt beim Serverzugriff stehen

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

  • Anwendung bleibt beim Serverzugriff stehen

    Hallo Leute,

    ich hoffe hier kann mir jemand helfen, denn ich bin schon am Verzweifeln. Wir haben eine C/S-Anwendung mit Delphi 6 und Firebird 1.52 entwickelt. Bei 9 von 10 Kunden läuft alles problemlos :-), aber bei einigen taucht folgendes Problem auf.

    Die Anwender arbeiten vorwiegend mit einer Tabelle auf dem Server. Wenn mehrere zugleich mit der erwähnten Tabelle arbeiten passiert es, das bei Anwender 2 das Programm stehen bleibt, während Anwender 1 ganz normal weiter arbeiten kann.
    Der Code sieht folgendermaßen aus.

    SQL.Text := 'INSERT INTO Journal VALUES(Gen_ID
    (Journal_Gen, 1),' + #39 + 'NOW' + #39
    + ', :aktion, :mnummer, :resultat, :mzf, :betrag, :user)';
    ExecSQL;

    Für mich sieht das so aus, als ob das Programm nach ExecSQL auf eine Rückmeldung vom Server wartet und keine bekommt. Ich bekomme auch keinerlei Fehlermeldungen welche ich für eine Auswertung heranziehen kann. Wie gesagt können alle anderen User ganz normal weiterarbeiten. Das wartende Programm wird über den Taskmanager beendet und der Eintrag in der Tabelle fehlt natürlich.

    Hat jemand eine Idee, wie ich zumindest eine brauchbare Fehlermeldung bekomme? Debuggen fällt aus, da wie gesagt dieses Phänomen bei einem Kunden auftritt und ich das Problem aus der Ferne lösen muss. Ich muss noch sagen, dass sich alle Clients als sysdba am Server anmelden. Die Userverwaltung findet in der Anwendung statt.

    Viele Grüße
    Norman

  • #2
    Hallo Norman,
    wie ist die Transaction eingestellt. Das sieht nach einem LockWait aus.

    Gruß, Fran

    Comment


    • #3
      Hallo Frank,

      ich hab folgendes eingestellt:

      Komponente TIBTransaction
      AutoStopAction: sacommit
      DefaultAction: TAcommit

      Kann es sein, dass das commit nicht immer greift? Zur Sicherheit hab ich noch einmal ein

      If frmmain.IBTransactionMKP.InTransaction then frmmain.IBTransactionMKP.commit;

      vor dem betreffenden Code eingefügt. Kann es aber leider erst nächte Woche beim Kunden testen. Und wieso tritt das bei anderen Installationen nicht auf?.

      Erst einmal vielen Dank für Deinen Tipp, hast Du noch ne andre Idee?

      Viele Grüße
      Norma

      Comment


      • #4
        Hallo Norman,

        wichtig sind die Eigenschaften in Params (automatisch bei Doppelklick auf Komponente).
        Du musst doch einen Isolationslevel einstellen.
        z.B.<BR>
        read_committed
        rec_version
        <B>nowait</B><BR>
        Gruß, Fran

        Comment


        • #5
          Hallo Frank,

          was ist ein Isolationslevel??? In den Params der Transaction-Komponente steht

          read_committed
          rec_version
          wait

          Kann es das wait sein??? Werd mal versuchen ein nowait einzutragen.

          Vielen Dank für die schnelle Unterstützung
          Norma

          Comment


          • #6
            Hallo Norman,
            jede Abfrage läuft im Kontext einer Transaktion.
            Es ist ein umfassendes Thema und ich empfehle dir, dich da mal genau zu belesen. Es ist z.B. im Buch von Henen Borrie (leider nur in englisch) umfassend beschrieben.
            Auf jeden Fall gibt es bei deinen Kunden Konflikte zwischen 2 Transaktionen. Da Wait gesetzt ist, wartet eine Transaktion so lange, bis die zweite Transaktion ein Commit oder Rollback ausgelöst hat.
            Wenn der eine Mitarbeiter zum Essen geht und halt nicht so schnell arbeitet, dann wartet die eine Transaktion halt mal etwas länger.
            An der Stelle würde ich auf NoWait umstellen, da dann eine Nachricht über den Lock - Konflikt erscheint. Das ist natürlich für dich noch mal etwas Arbeit. Denn du musst im diesem Falle einen Dialog zum Wiederholen oder Abbrechen (Rollback) anbieten und diese Message aus den Errors herausfiltern und behandeln.
            Ich habe dazu allerdings keine Erfahrung mit IBX, mit den IBO geht das sehr einfach.

            Gruß, Fran

            Comment


            • #7
              Hi Frank,

              danke für die Info. Mit Transaktionen hab ich mich schon beschäftigt. Wahrscheinlich aber nicht ausreichend genug ;-). Die engl. Lektüre wird für mich etwas zu schwer sein. Werd mich mal nach deutscher Literatur umsehen.

              Das Problem bei meinen Kunden ist aber nicht, das einer zu Mittag geht und vergisst die Transaktion abzuschließen. Die Transaktionen laufen in einer Routine, welche in einem Zug durchlaufen wird. Da kann es sich nur um ms handeln. Wahscheinlich wir die Transaktion trotz autocommit nicht richtig commited.

              Werd aber trotzdem mal Deinen Vorschlag aufgreifen und über nowait eine Fehlerbehandlung einbauen.

              schöne Pfingsten wünscht
              Norma

              Comment

              Working...
              X