Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Legacy-Anwendung TTable->TFDTable LockTable (https://www.delphipraxis.net/210215-legacy-anwendung-ttable-tfdtable-locktable.html)

Poelser 18. Mär 2022 08:25

Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC

Legacy-Anwendung TTable->TFDTable LockTable
 
Moin zusammen,

wo gerade ein Thread über den Umgang mit Legacy-Anwendungen am Laufen ist, habe ich hier ein Problem mit dem Sprung von D7 auf D10.4.2.

In dem alten Code sind solche Sachen drin, wie
Delphi-Quellcode:
TabelleXYZ.LockTable(ltWriteLock)
bzw. UnLockTable(). Dies Locks sind in der alten Unit DBTables drin.
Aber die gibt es ja nicht mehr. FireDAC hat da scheinbar nix Passendes, und Google war auch nicht wirklich hilfreich 20 Jahre zu überspringen :gruebel:.
Hat irgendwer einen Link o.ä. um mir da mal auf die Sprünge zu helfen?

Uwe Raabe 18. Mär 2022 09:18

AW: Legacy-Anwendung TTable->TFDTable LockTable
 
Zitat:

Zitat von Poelser (Beitrag 1503578)
In dem alten Code sind solche Sachen drin, wie
Delphi-Quellcode:
TabelleXYZ.LockTable(ltWriteLock)
bzw. UnLockTable(). Dies Locks sind in der alten Unit DBTables drin.
Aber die gibt es ja nicht mehr. FireDAC hat da scheinbar nix Passendes,

Nein, Locking geht einfach nicht mehr. FireDAC geht da einen anderen Ansatz, so nach dem Motto: Mach erst mal und reagiere, wenn es nicht klappt.

Wenn ein geänderter Datensatz gespeichert wird, kann man über UpdateMode entscheiden, welche Felder in der WHERE Klausel angegeben werden. Bei upWhereAll werden alle abgerufenen Felder eingesetzt. Damit kann man sicherstellen, dass zwischenzeitlich keines der Felder verändert wurde. Bei upWhereChanged sind das nur die Felder, die man selbst verändert hat. Das lässt sich noch über die ProviderFlags in jedem einzelnen Feld feintunen.

Schlagt nun ein solches Update fehl, weil z.B. ein Feld von anderer Stelle verändert wurde, kann man im OnReconcileError der Query entsprechend darauf reagieren.

Frickler 18. Mär 2022 09:32

AW: Legacy-Anwendung TTable->TFDTable LockTable
 
Die Frage ist: wofür wurde das verwendet? Wurden tatsächlich in einer Firebird-Datenbank ganze Tabellen gelockt?

Poelser 18. Mär 2022 09:46

AW: Legacy-Anwendung TTable->TFDTable LockTable
 
Zitat:

Zitat von Frickler (Beitrag 1503585)
Die Frage ist: wofür wurde das verwendet? Wurden tatsächlich in einer Firebird-Datenbank ganze Tabellen gelockt?

Ja. Das hatte wohl den Sinn, dass da z.B. irgendwelche Prozentsätze nicht geändert werden durften, wenn die in einer Kalkulation gelesen wurden.

Wie Uwe schon geschrieben hatte, ist diese Vorgehensweise wohl ohnehin nicht mehr möglich. Ich bin momentan da wohl eher besser beraten, dass ganze transactionbasiert umzusetzen. Glücklicherweise bin ich in der Situation, dass nicht 1:1 umsetzen zu müssen. Und der Aufwand dafür hält sich in Grenzen, da diese alte Technik in dem Fossil nicht sooo oft benutzt wurde :).

BerndS 18. Mär 2022 10:26

AW: Legacy-Anwendung TTable->TFDTable LockTable
 
Da ich die BDE nicht mehr installiert habe, kann ich nur vermuten, dass das nur innerhalb von Anwendungen funktioniert, die die BDE verwenden. Sollte ich mich richtig erinnern, gab es eine Datei, auf die alle Anwendungen Zugriff haben mussten. Das standen dann die Sperren usw. drin.
Aber 100% sicher bin ich mir da nicht.

Wir haben das in Firebird mit eine Sharetabelle gelöst. Da stehen der Tabellenname, die ID des Datensatzen oder ID = 0 für die ganze Tabelle drin. Zusätlich so Name, Grund und eine ConnectionID, so dass erkannt werden kann, ob die Sperre noch gültig ist.
Über den Tabellennamen + ID gibt es einen eindeutigen Index, wodurch eine Sperre nur einmal möglch ist.

Dadurch funktionier das ganze nur, wenn man die Sharetabelle auch auswertet und beschreibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:56 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