Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Blockade anderer Anwender (https://www.delphipraxis.net/67758-blockade-anderer-anwender.html)

MPirnstill 19. Apr 2006 13:43

Datenbank: MS-SQL-Server • Version: 2000 • Zugriff über: BDE - TTable

Blockade anderer Anwender
 
Hi!

Bei einer älteren Client-/Server-Anwendung tritt folgendes Problem auf:

Sofern ein Anwender in einem Eingabedialog nacheinander mehrere Datensätze bearbeitet/vervollständigt, werden nach einer unbestimmten Zeit die anderen Anwender blockiert. Wenn der blockierende Anwender die Anwendung kurz verläßt, läuft für eine Weile wieder alles normal. Doch nach einer unbestimmten Zeit tritt die Blockade wieder auf.

Jetzt habe mir die Anwender noch gesagt, daß dieses Problem schon früher aufgetreten ist, nur scheint da das Programm nicht komplett blockiert zu haben, sondern es lief nur langsamer. Aber seit wir jetzt CITRIX im Einsatz habe, soll es wohl voll blockieren.

Ich vermute ja, daß da irgend ein Speicher voll läuft, aber ich weiß nicht wie ich dem Problem auf die Schliche kommen soll. :gruebel: Vor allem weil sehr unregelmäßig auftritt.
Insgesamt sind vielleicht 15 Anwender in dem System.

Hat von euch einer eine Idee :idea: wo und wie ich am besten suchen könnte, um dies Problem zu lokalisieren.

Gruß

marabu 19. Apr 2006 14:32

Re: Blockade anderer Anwender
 
Hi Micha,

Ressourcen-Verknappung könntest du durch internes (MemCheck) oder externes (PerfMon) Monitoring verifizieren. Aber vielleicht musst du einfach nur mal den Locking-Mechanismus im Zusammenspiel von BDE und MSSQL studieren.

Grüße vom marabu

MPirnstill 19. Apr 2006 15:30

Re: Blockade anderer Anwender
 
Hi Marabu!

Vielen Dank für deine Antwort. :thumb: :cheers:

Zitat:

Zitat von marabu
Ressourcen-Verknappung könntest du durch internes (MemCheck) oder externes (PerfMon) Monitoring verifizieren.

Den Performance-Monitor kenne ich ja, aber was meinst du mit MemCheck? Windows XP kennt MemCheck nicht und in der Delphi-Hilfe (Delphi 2.0) habe ich auch nichts gefunden. :gruebel:

Zitat:

Zitat von marabu
Aber vielleicht musst du einfach nur mal den Locking-Mechanismus im Zusammenspiel von BDE und MSSQL studieren.

Bin gerade am gerade dabei die SQL-Server-2000-Dokumentation betr. Sperren zu lesen und hab etwas gefunden, was der Grund für die Blockade sein könnte. Da steht, daß der SQL-Server, bei Transaktionssperren für mehrere Datensätze diese ggfs. auf eine Tabellensperre ausweitet. Wenn das so ist muß ich sehen wie ich das abstellen kann. Wobei ich der Meinung bin, daß einen "Dirty-Read" mache und das ja eigentlich nicht blockieren dürfte. :zwinker:

Gruß

MPirnstill 26. Apr 2006 11:55

Re: Blockade anderer Anwender
 
Hallo Leute!

Haben heute mal eine Test gemacht und es ist tatsächlich so, daß nach einer gewissen Anzahl an Änderung der SQL-Server 2000 auf Tabellensperre umschaltet, obwohl ich vom Programm aus nur einzelne Datensätze sperre. Es ist z.B. so:

Zitat:

Master-Tabelle:
P1ST
___Details:
+-> P1STKL
+-> P1STMP
+-> P1STHA
Detail-Tabellen sind mit der Master über Foreign-Key verknüpft.
Auf einen Datensatz aus P1ST kommen 4 in P1STKL, 4 in P1STMP und einer in P1STHA. Die Datensätze wurde zuvor angelegt und erst bei der Vervollständigung (EDIT) passiert es das nach einer gewissen Anzahl bearbeiteter Datensätze die Tabelle P1STKL plötzlich komplett gesperrt ist und damit alle anderen Benutzer, welche in der gleichen Dialogformular arbeiten gesperrt sind bis es zum SQLTimeout kommt bzw. der sperrende Benutzer in seinem Formular auf Speichern klickt.

In der Dokumentation des MS SQL-Server 2000 steht nun das die dynamische Sperrung automatisch unter gewissen Voraussetzungen die Sperre von Datensatz auf Datenseite auf Tabelle erweitert um Resource zu sparen. Hat die Version 6.5, welche wir früher im Einsatz hatten nicht gemacht.

Kann ich das irgendwie abschalten, darüber habe ich nämlich noch nichts gefunden, bzw. hat jemand evtl. ein andere Idee/Lösung? :?:

Wie gesagt, im meinem Programm sage zu Beginn der Bearbeitung:
Delphi-Quellcode:
MyDatabaseObjekt.StartTransaction;
und beim Post (sofern die Transaktion offen ist)
Delphi-Quellcode:
MyDatabaseObjekt.Commit;
Da dürfte doch keine Sperre mehr offen sein.

[Edit]Noch vergessen! Vom meinem Programm her werden alle Benutzer unter dem gleichen SQL-Benutzer angemeldet. Haben es aber auch schon mit unterschiedlichen SQL-Benutzern getestet und da tritt die Blockade ebenfalls auf.[/Edit]
Gruß

marabu 26. Apr 2006 12:21

Re: Blockade anderer Anwender
 
Hallo Micha,

hast du schon den Eintrag locks (Option) im Handbuch entdeckt? Damit kann der Mechanismus der Sperrenausweitung (lock escalation) beinflusst werden. Es macht mich aber schon ein wenig stutzig, dass du auf solche Probleme stößt.

Grüße vom marabu

jim_raynor 26. Apr 2006 12:50

Re: Blockade anderer Anwender
 
MemCheck ist eine unit die ins Projekt eingebunden wird und einen alternativen Speichermanager bietet, der prüft, ob Speicher korrekt wieder freigegeben wird.

Such mal Bei Google suchenMemCheck.Pas bei google.

MPirnstill 26. Apr 2006 13:02

Re: Blockade anderer Anwender
 
hey, danke erstmal für die Antworten.

Zitat:

Zitat von marabu
... . Es macht mich aber schon ein wenig stutzig, dass du auf solche Probleme stößt.

Was meinst du damit, daß Dich das stutzig macht? :wiejetzt:

Gruß

marabu 26. Apr 2006 13:04

Re: Blockade anderer Anwender
 
Damit meine ich, dass ich keine Anzeichen erkenne, dass dein Projekt einen MS SQL Server 2000 an seine Grenzen bringen könnte.

marabu

MPirnstill 26. Apr 2006 13:08

Re: Blockade anderer Anwender
 
Zitat:

Zitat von jim_raynor
MemCheck ist eine unit die ins Projekt eingebunden wird und einen alternativen Speichermanager bietet, der prüft, ob Speicher korrekt wieder freigegeben wird.

Such mal Bei Google suchenMemCheck.Pas bei google.

MemCheck wurde weiter oben im Thread auch schon mal vorgeschlagen, hab ich auch mal angeschaut, aber es scheint hier wohl doch eher um ein SQL-Server Problem zu gehen, was der heutige Test belegt hat. Und MemCheck ist eher für Speicherlecks, wobei ich auch noch Probleme damit hatte, da ich ja unter Delphi 2.0 arbeite.

Trotzdem Danke für den Tip.

Gruß

MPirnstill 5. Mai 2006 06:58

Re: Blockade anderer Anwender
 
Hi!

Will den Thread mal abschließen.

Ergebnis:
Wir hatten letztens einen von einer Hotline am Telefon, der dann meinte ich muß wohl mein Programm umschreiben, damit die Tranaktion nicht solange auf ist. Das Prog ist halt schon über 10 Jahre alt und so konzipiert gewesen. Werd mal sehen, was ich machen kann, aber verstehen tue ich das nicht. Mein Prog lief einwandfrei mit MS-SQL-Server 6.5 und dann kommt der 2000-er (schneller, breiter, größer :gruebel: ), und das Ding ist gleich wieder so super-schlau (z.B. dynamisches Sperren), daß es einem nur Probleme bereitet. Genau wie bei M$-Word, daß macht auch zu viel Dinge die stören. :drunken:

Nochmals Danke für eure Hilfe. :cheers:

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz