Announcement

Collapse
No announcement yet.

MS-SQL 7 Delphi 5 BDE: Sperren werden nicht aufgehoben ('Fehler in Funktionssequenz').

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

  • MS-SQL 7 Delphi 5 BDE: Sperren werden nicht aufgehoben ('Fehler in Funktionssequenz').

    Hallo,
    erstmal eine Beschreibung:
    Datenbank: MS-SQL 7 SP3 Zugriff über ODBC V 2000.80.194.00
    BDE: 5.11 Deut
    Delphi 5 SP1
    Tabelle: 15000 Datensätze, mehrere Textindizies, Zugriff über TTable

    Problem: Nach dem Aktivieren des Table-Objekts von einem Client aus kann es dazu kommen, das die anderen Clients beim Zugriff auf die Tabelle die Meldung:'Allgemeiner SQL-Fehler: [Microsoft][ODBC Driver Manager] Fehler in Funktionssequenz.' erhalten. Dies hört erst auf, wenn der Client, der das Problem ausgelöst hat, ein Requery oder Post abschickt. Seine Sperren bleiben solange auf den SQL-Server bestehen (Pag-Sperren , Status S).

    Vielen Dank schon mal,
    Kai

  • #2
    Hallo,

    wie sieht die Transaktionsverwaltung in dieser Anwendung aus? Wann wird eine Transaktion nach dem Schreibzugriff auf die Datenbank beendet

    Comment


    • #3
      Hallo!
      Der Fehler tritt ohne Schreibzugriff auf. Wir haben festgestellt, daß der Fehler auftaucht, wenn der NT-Server der Datenbank eine CPU-Belastung von 100 % erreicht (passiert schon, wenn man ein Timer laufen läßt,der das beschriebene TTable-Objekt deaktviert, aktiviert und dann eine Sekunde bis zur Wiederholung wartet).
      Wenn man diesen Timer auf zwei Clients aktiviert, entsteht der Fehler, läßt man den Timer auf vier Rechnern laufen, bleibt die CPU-Belastung fast durchgängig bei 100 % ).
      Wenn man ein Lock-Timeout setzt, kommt die Meldung, das die Sperre für das Aktualisieren des Datensatzes nicht errichtet werden konnte (auf den anderen Clients, die einen Zugriff probieren).
      Wenn man in die Timer-Funktion nach der Aktivierung des TTables ein Refresh auf dem TTable absetzt, tritt der Fehler nicht auf.
      Es findet auch keine 'grosse' Transkation beim Schreibzugriff statt, sondern es handelt sich dabei um die Übertragung einer Aktualisierung bei einen einzelnen Datensatz (TTable.Post), die nicht zugelassen werden (findet über Standard-Komponente statt).
      Ka

      Comment


      • #4
        Hallo,

        wieviel Datensätze umfasst die Datenmenge von TTable? Bei einer Tabelle mit 15 000 Datensätzen ist es nicht empfehlenswert, TTable ohne Filter (der intern als SELECT-Abfrage mit WHERE-Einschränkung umgesetzt wird) zu aktivieren. Fordert man alle Datensätze ab (kein Filter), so muss man damit rechnen, dass die VCL die Daten zu "retten" versucht, indem alle Datensätze vom Server zum Client transport und im RAM zwischengepuffert werden. Dies wäre auch eine Erklärung für die 100% CPU-Auslastung. Auch wenn nur ein einziger Datensatz dieser Datenmenge geändert wird, muss die VCL alle Datensätze aktualisieren und somit neu laden. Um nachzuprüfen, ob dieser Fall zutrifft, mann man alle Datenbankaktionen über das SQL Server-Zubehör <b>Profiler</b> mitverfolgen.

        Ich würde daher das Design der Anwendung grundlegend ändern und mehr auf die Belange von C/S-Datenbanken (die mengenorientiert arbeiten) ausrichten. Dabei spielt der gewählte <b>Isolation Level</b> (siehe TDatabase.TransIsolation) eine wichtige Rolle

        Comment

        Working...
        X