Globales DbRLockList()?

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Globales DbRLockList()?

Beitrag von Jan »

Datenbanken werden ja immer Thread-Lokal geöffnet. Und damit funktioniert leider auch DbRLockList() nur Thread-Lokal. Gibt es irgendeine Möglichkeit herauszufinden, ob in irgendeinem Thread ein Satz einer bestimmten dbf geöffnet ist? Klar gäbe es den Umweg, ein eigenes Lock-Array mitzuführen. Aber ein einfacherer Weg wäre mir ehrlich gesagt irgendwie lieber ...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Globales DbRLockList()?

Beitrag von AUGE_OHR »

Jan hat geschrieben:Gibt es irgendeine Möglichkeit herauszufinden, ob in irgendeinem Thread ein Satz einer bestimmten dbf geöffnet ist?
wenn der Record, egal ob anderer Thread oder andere App, gelockt ist kannst kein weiterer Lock auf den selben Satz erfolgen.
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von Jan »

Jimmy,

genau das ist ja der Punkt. Ich würde gerne vor irgendwelchen Lock-Versuchen, eigentlich schon direkt bei Aufruf einer Funktion die locken wird, feststellen, ob da schon was gelockt ist. Dann kann ich den Nutzer darauf hinweisen das es hier vermutlich Probleme geben wird, und diese Funktion daher jetzt nicht weiter ausgeführt sondern abgebrochen wird.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Globales DbRLockList()?

Beitrag von Manfred »

wo liegt denn der Unterschied, ein Rlock() zu versuchen oder in einer Liste nachzuschauen? Das Ergebnis ist doch das gleiche, oder nicht?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von brandelh »

Ich meine ich hätte eine Funktion IsLocked() gesehen, aber ich denke dass die genau das macht ... prüfen ob man locken kann, wenn nicht gibt es .f. zurück.

Im Übrigen, kann sich das ja zu jeder Millisekunde ändern ;-)
Du könntest ein Feld mitführen, das nach einem LOCK einen Inhalt bekommt und kurz vor Ende wieder geleert wird, aber wenn der PC dann abschmiert gilt der Satz weiterhin als gelocked
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von Jan »

Manfred,

naja, das ist schon ein Unterschied. Ob ich mal eben schaue ob ein Array die Länge 0 hat (also kein Satz gelockt ist), oder ich mehrere hunderttausend Sätze durchskippe und dabei versuche jeden einzelnen zu locken, ist schon ein Unterschied. Insbesondere in der Performance.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von brandelh »

Die Idee daran ist schon ... ok weltfremd ;-)

Wenn du wissen willst, OB ein Satz in einer DBF gelockt ist nimm FLOCK()

Im übrigen sag ich nur meine Meinung dazu, ob sie dir gefällt ist nicht mein Problem. 8)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Globales DbRLockList()?

Beitrag von Manfred »

hä?

Du willst doch nur einen bestimmten Satz locken? Den kennst Du doch zum zeitpunkt der "Anfrage" Und außerdem wie willst Du dann ein Locking von einem anderen Platz abfangen? Der steht doch sowieso nicht in Deiner Liste.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von brandelh »

Also mit einer Funktion, die intern ein STATIC Array hat und von allen Threads gefüttert wird (add / delete) wäre die Liste für die aktuelle EXE machbar.

Aber weder eine andere EXE AUF dem Rechner noch eine im sonstigen Netzwerk kümmern sich darum !

Wenn du wissen willst ob die Aktion OK geht, musst du alles nötige sperren, wenn OK dann OK, wenn nicht dann nicht :badgrin:
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von Jan »

Manfred,

nein. Ich hatte doch am Anfang geschrieben das ich wissen möchte, ob ein Satz gesperrt ist. Damit meinte ich "irgendein Satz". Keinen bestimmten.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Globales DbRLockList()?

Beitrag von Manfred »

OK, das habe ich verstanden, aber was machst Du wenn eine andere Station einen Satz gesperrt hat? Deine Frage erscheint mir aber eher philosophischer Natur?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von brandelh »

Jan hat geschrieben: ob ein Satz gesperrt ist. Damit meinte ich "irgendein Satz". Keinen bestimmten.Jan
die Lösung dafür ist flock()
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Globales DbRLockList()?

Beitrag von Manfred »

oder so.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von Jan »

Hubert,

gute Idee! Das werd ich mal testen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von Tom »

FLock() ist gefährlich, weil es die gleiche Wirkung hat, als würde man eine Tabelle exklusiv verwenden. In anderen Worten: Sie kann, wenn die Funktion .T. zurückliefert, an keinem anderen Arbeitsplatz mehr im Shared Mode verwendet werden - sondern nur noch im Read Only Mode. Letztlich gibt die Funktion also nur Auskunft darüber, ob man der einzige ist, der diese Tabelle derzeit anfasst. Das ist aber nicht das, was Jan wissen will. Die Tabelle kann ja auf mehreren Arbeitsplätzen verwendet werden - er will "nur" wissen, ob irgendein Datensatz in dieser Tabelle gesperrt ist. Da DbRlockList() streng threadlokal arbeitet und tatsächlich nur die eigenen Sperren auflistet (öffne ich eine Tabelle in zwei Threads und sperre einen Datensatz im einen Thread, sehe ich diese Sperrung in der DbRLockList() für die im zweiten Thread geöffnete Tabelle nicht - und natürlich auch nicht Sperrungen durch andere Arbeitsplätze), ist die Funktion hierfür nicht verwendbar. Meines Erachtens besteht der einzige verlässliche Weg darin, tatsächlich zu prüfen, ob sich jeder einzelne Datensatz sperren lässt, wobei sich dann noch die Frage stellt, wozu man das braucht. Wie gesagt, die Auskunft, die FLock() liefert, ist letztlich die gleiche, die ein erfolgreiches USE ... EXCLUSIVE anbietet (also ohne NetErr() .T.) - mit den gleichen unangenehmen Konsequenzen: Die Tabelle lässt sich an anderen Arbeitsplätzen überhaupt nicht mehr bzw. nur noch im reinen Lesezugriff öffnen.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Globales DbRLockList()?

Beitrag von Manfred »

ich hatte auch zu schnell zugestimmt, was Hubert vorschlug. Tom war aber schneller mit seinem Text. Mir kam dann auch die Frage auf, wenn ein FLock() greift, was dann zu tun wäre? Also, m.E. ist es einfach das beste ein RLock() und dann abzuwarten. Ich verstehe nicht warum das nicht gehen soll. (was nicht heißt, das es nicht irgendeinen geheimen Grund geben könnte ;-) )
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von brandelh »

Tom,
Tom hat geschrieben: FLock() ist gefährlich, weil es die gleiche Wirkung hat, als würde man eine Tabelle exklusiv verwenden. In anderen Worten: Sie kann, wenn die Funktion .T. zurückliefert, an keinem anderen Arbeitsplatz mehr im Shared Mode verwendet werden - sondern nur noch im Read Only Mode. Letztlich gibt die Funktion also nur Auskunft darüber, ob man der einzige ist, der diese Tabelle derzeit anfasst.
sorry aber das ist unsinn !

Shared öffnen kann man eine gesperrte Datei !

Ansehen geht, Lesen geht, nur erneute Sperren gehen nicht und natürlich muss man das gleich wieder freigeben wenn man die Datei nicht mehr sperren will.

JAN will wissen ob ein Satz gesperrt ist und das geht genauso wie beschrieben.

Ob es SINN macht ist eine andere Frage denn das kann sich sofort ändern.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Globales DbRLockList()?

Beitrag von Jan »

Auch Danke für diesen Hinweis. Ich denke mal, daß das bei mir nicht das große Problem sein sollte. Wenn ein FLock() klappen sollte, kann ich ja direkt im Anschluß ein DbUnLockAll() machen. Ich habe mir eine erweiterte DbRLock()-Funktion geschrieben, die bis zu 10x versucht, einen Satz zu locken. Damit kann ich den Sekundenbruchteil zwischen Datei-Locken und -Freigeben überbrücken.

Denke ich mal. Muß ich halt genau testen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten