Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie würdet Ihr eine Mehrbenutzersperre realisieren? (https://www.delphipraxis.net/70546-wie-wuerdet-ihr-eine-mehrbenutzersperre-realisieren.html)

Janek76 31. Mai 2006 18:50

Datenbank: MSSQL • Zugriff über: ADO

Wie würdet Ihr eine Mehrbenutzersperre realisieren?
 
Hallo!

Folgende Frage habe ich:

Ich greife in Delphi 7 mit den AdoComponenten auf den MSSQL-Server zu. Das Programm soll im Terminal-Server laufen.

Ich benötige für mein Programm eine Mehrbenutzersperre, d.h. solange das Formular für das Unterprogramm geöffnet ist, soll kein anderer mit diesem Programm auf der Datenbank arbeiten, mit anderen Programmen und Unterprogrammen ggf. unter dem selben Benutzernamen schon.

Ich dachte ich schreibe in eine Tabelle einen Wert, der bei 0 beginnt, beim OnCreate-Event des Formulars um 1 hochgezählt und bei OnClose um 1 erniedrigt wird. Jedesmal wenn nach dem Öffnen der Wert ungleich 1 ist, würde ich die Sperre im Programm aktivieren.

Nun kann es aber passieren, daß das Programm abgeschossen wird oder der Rechner abstürzt. Dann würde die OnClose-Routine nicht ausgeführt werden und die Sperre wäre dauerhaft aktiviert, weil ein falscher Wert in der Tabelle stehen würde. Dafür müßte ich einen Button einrichten, mit dem man die Mehrbenutzersperre zurücksetzen kann. Das möchte ich aber verhindern. Daher habe ich zwei Fragen:

1) Gibt es sowas wie eine eindeutige Connection-ID bei TAdoConnection, die ich abfragen kann, die dann verschwindet, wenn keine Verbindung mehr besteht? Oder gibt es einen flüchtigen Speicher innerhalb einer Instanz des Programms, den ich im Terminal-Server aus einer anderen Instanz abfragen kann?

2) Wie kann ich mir die offenen Verbindungen zur Datenbank auflisten lassen?

Mich würden sehr Eure Meinungen interessieren. Wie würdet Ihr das umsetzen. Ist der Weg richtig oder macht man das anders?

sancho1980 31. Mai 2006 19:50

Re: Wie würdet Ihr eine Mehrbenutzersperre realisieren?
 
also ohne mit mysql jemals gearbeitet zu haben:
bist du dir sicher, dass du diese mehrbenutzersperre brauchst?

bei firebird beispielsweise kümmert sich das rdbms selbst um die datenintegrität (und darauf willst du doch hinaus, oder?), und ich wäre davon ausgegangen, dass das mittlerweile standard bist .. correct me if i'm wrong

was die einzelnen benutzer am ende sehen :shock: lässt sich über das isolation level einstellen

gruß

martin

omata 31. Mai 2006 19:53

Re: Wie würdet Ihr eine Mehrbenutzersperre realisieren?
 
Wieso mysql? ich dachte es geht um MSSQL...

sancho1980 31. Mai 2006 19:54

Re: Wie würdet Ihr eine Mehrbenutzersperre realisieren?
 
oh, ja stimmt :oops:

damit hab ich aber genauso wenig gearbeitet; und meine antwort bleibt die gleiche :-)

Jelly 31. Mai 2006 20:10

Re: Wie würdet Ihr eine Mehrbenutzersperre realisieren?
 
Du hast beim MSSQL Server in der Tabelle sysprocesses aus der Master Datenbank ganz detailliert aufgelistet, welcher User sich gerade mit welchem Programm in die Datenbank eingeloggt hat. Sobald Du die Anwendung beendest, oder dein Programm abstürzt und dadurch bedingt die Verbindung zur Datenbank verliert, wird dies in der besagten Tabelle mitgepflegt.

Meistens ist es aber nun so, dass du als normaler User gar nicht an die Master Datenbank randarfst, da hilft Dir dann aber die Erstellung einer View in deiner Datenbank, die dann von jedem gelesen werden kann...

Kuck Dir mal diesen Thread genauer an, da hab ich genau beschrieben, wie Du sowas realisieren kannst...

Lass also das Gefriemele aus Delphi heraus irgendwie mitzuloggen, wer wo wann was macht. Überlass dies dem Datenbankserver :-)

Janek76 31. Mai 2006 20:18

Re: Wie würdet Ihr eine Mehrbenutzersperre realisieren?
 
Ja. Es geht um den Microsoft SQL-Server.

Das eine Programm stößt einen Importvorgang an, das andere exportiert Daten und hakt sie am Ende des Prozesses als erledigt ab, wenn der Prozeß erfolgreich war.

Für beide Unterprogramme brauche ich eine Mehrbenutzersperre. D.h. der Prozeß muß erst komplett abgelaufen sein. Dann sind alle temporären Daten abgearbeitet und der nächste kann dann mit den aktualisierten Daten starten. Die Mehrbenutzersperre ist wichtig, sonst würde es Durcheinander geben und die Mitarbeiter würden nicht mit aktuellen Daten arbeiten. Eine pessimistische Datensatzsperre reicht nicht aus, ich brauche sowas für den ganzen Prozeß.


Lese jetzt gerade die letzte Antwort. Sehr hilfreich. Vielen Dank. Werde mal in den anderen Thread gucken.

Elvis 31. Mai 2006 20:32

Re: Wie würdet Ihr eine Mehrbenutzersperre realisieren?
 
Zitat:

Zitat von Jelly
Lass also das Gefriemele aus Delphi heraus irgendwie mitzuloggen, wer wo wann was macht. Überlass dies dem Datenbankserver :-)

Das bringt aber nur was bei klassichen 2-Tier Lösungen.
Ein Windowsserver bietet mit DCOM/EnterpriseServices eine nette Architektur um solche Sperren DBMS-unabhngig und vor allem auch DBMS-übergreifend zu lösen. Ein DB-Server taugt nicht wirklich viel als App-Server, packe da zuviel Logik rein und du wirst dich nur noch mit den Unzulänglichkeiten DB-interner Skriptsprachen wie TSQL, PSQL oder PL/SQL rumärgern müssen...

Ich selbst gehe leiber meinen Weg, fernab von DCOM, aber DCOM bietet einige Schmankerl wie verteilte Transkationen und Callbacks zum Client objekt.
Ich denke Bernhard dürfte ein ziemlicher DCOM Crack sein, vllt schreibt er was zu dem Aufwand, den ein simpler Sperrserver machen würde und wieviel Mehraufwand ein DCOM-basierter Datenzugriff bedeuten würde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 Uhr.

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