Globales DbRLockList()?
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Globales DbRLockList()?
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
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Globales DbRLockList()?
wenn der Record, egal ob anderer Thread oder andere App, gelockt ist kannst kein weiterer Lock auf den selben Satz erfolgen.Jan hat geschrieben:Gibt es irgendeine Möglichkeit herauszufinden, ob in irgendeinem Thread ein Satz einer bestimmten dbf geöffnet ist?
gruss by OHR
Jimmy
Jimmy
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: Globales DbRLockList()?
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!!
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!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
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
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
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
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.
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.
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: Globales DbRLockList()?
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.
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!!
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!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
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
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
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: Globales DbRLockList()?
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!!
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!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
die Lösung dafür ist flock()Jan hat geschrieben: ob ein Satz gesperrt ist. Damit meinte ich "irgendein Satz". Keinen bestimmten.Jan
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: Globales DbRLockList()?
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!!
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!!
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
Hubert,
gute Idee! Das werd ich mal testen.
Jan
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
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
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21225
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 70 Mal
Re: Globales DbRLockList()?
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!!
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!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
Tom,
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.
sorry aber das ist unsinn !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.
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
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Globales DbRLockList()?
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.