Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Interbase Update sperren realisierem (https://www.delphipraxis.net/40855-interbase-update-sperren-realisierem.html)

Albi 22. Feb 2005 08:45

Datenbank: Interbase • Zugriff über: Standardkompo

Interbase Update sperren realisierem
 
Hallo,

ich möchte für die Interbase eine Updatesperre basteln und weiß nicht genau wie das am besten realisieren kann.

Mein Ausgangspunkt ist bis jetzt, dass ich ein eine Eingabemaske habe. Sobald der User einen gesuchten Eintrag gefunden hat, sind die Edits enable = False. Wenn nun der User auf den Bearbeitung Btn klickt werden die Edits enable = true und er kann die Daten bearbeiten. Soweit ist das auch kein Problem.

Ich will nun aber, dass der DS sobald ein User diesen Bearbeiten will für alle anderen user gesperrt wird bzw. nur gelesen werden kann.

Nun habe ich hier im Forum von einer Sperrtabelle oder simulierten Updates gelesen und nun habe ich gefragt ob es da noch eine andere Möglichkeit gib.

Jens Schumann 22. Feb 2005 09:09

Re: Interbase Update sperren realisierem
 
Hallo,
der Interbase/Firebird arbeitet mit einer Multigenerationenarchitekur Bei Google suchenMGA Interbase.
Da werden keine Locks unterstützt.

Wenn in der Zwischenzeit ein anderer User den Datensatz geändert hat könntest Du wie folgt darauf reagieren:
Wenn Du eine Tabelle mit Vor- und Nachnamen hast könntest Du das Update folgendermaßen
realisieren

SQL-Code:
UPDATE tabelle SET vname='Delphi', nname='Praxis' WHERE (vname=alter_vorname) and (nname=alter_nachname)
alter_vorname und alter_nachname stehen für die Werte, die beim Lesen des Datensatzes aus der Datenbank gekommen sind. Wenn jetzt ein anderer User den Datensatz geändert hat, geht das Update schief. Dann könntest vom User bestätigen lassen ob der inzwischen geänderte Datensatz überschrieben werden soll.

Albi 22. Feb 2005 09:38

Re: Interbase Update sperren realisierem
 
Das ist mir schon klar gewesen, dass es die Sperrmechanismen bei Interbase gibt, nutze ich auch.

Aber ich will halt, dass der DS bereits beim klicken auf Edit eine Sperre erhält und nicht erst wenn die Transaction gestartet wird.

Beim Klick auf Edit werden nur die Edit enable = true gesetzt, somit weiß die DB aber noch nicht, dass der DS gerade bearbeitet wird. Aber das genau will ich der DB auf irgendeine Art&Weise mitteilen.

Robert_G 22. Feb 2005 09:41

Re: Interbase Update sperren realisierem
 
Eine Mögichkeit wäre sicher Firebirds event system (User X ändert etwas -> Clients von User Y & Z werden benachritigt)
Aber alles was man da auch basteln kann ist in einer simplen C/S Architektur nur Rumgebastel. ;)
Wirklich konsistent kannst du sowas IMHO nur mit einer MiddleTier lösen. ;)

Albi 22. Feb 2005 10:19

Re: Interbase Update sperren realisierem
 
Das wäre für diese Anwendung doch ein wenig hochgegriffen. Da lasse ich es lieber so wie es ist und es gib ne Meldung für darüber, dass der DS bereits von einem anderem User geändert wurde.

proitsystems 22. Feb 2005 10:33

Re: Interbase Update sperren realisierem
 
der aktuelle Firebird unterstützt doch die Anweisung "SELECT .... FOR UPDATE". Damit werden die Daten gelockt. Bevor das Dataset in den Editmode geht könnte man auf der gleichen Transaktion dieses SELECT Statement ausführen.

Eine andere Möglichkeit wäre (bevor das Dataset in den Editmode geht) ein Pseude Update zu fahren (UPDATE Tabelle SET Feld = Feld WHERE ID = x). Natürlich in der gleichen Transaktion.

Beim Commit oder Rollback ist das Lock dann wieder aufgehoben.


Gruss,

Marc
----
PRO IT SYSTEMS

Albi 22. Feb 2005 11:25

Re: Interbase Update sperren realisierem
 
Zitat:

Zitat von proitsystems
der aktuelle Firebird unterstützt doch die Anweisung "SELECT .... FOR UPDATE". Damit werden die Daten gelockt

Vielen Dank, diese Variante werde ich mal versuchen.

Nur so zur Sicherheit. Die Anweisung sollte dann im ganzen so in etwa aussehen

SQL-Code:
select ID From DB WHERE ID = :iID For Update

mschaefer 30. Dez 2008 21:13

Re: Interbase Update sperren realisierem
 
Hier mag ich nochmal nachhaken:

Das ein User einen gerade in Bearbeitung befindlichen Datensatz nicht bearbeiten kann
ist bei Delphi mit FB eine reine Katastrophe im Gegenatz zu Oracle-Forms-Anwendungen
wo dies mit einer Selbstverständlichkeit völlig automatisch realisiert ist.



Möglichkeit für einen einzelnen Datensazt:

- Dummy edit und Post -> Error, dann gelocked


Möglichkeiten in einem Grid als momentan Anzeige darzustellen welche Datensätze gerade gelockt sind:

- Für jeden Datensatz duchgehen: Dummy edit und Post -> Error, dann gelocked


Erstaunlich ist allerdings, das sowas noch nicht in eine erweiterte Query-Komponente eingebauet worden ist.
Denn letzlich geht es doch nur darum beim umstellen auf 'edit' gleich einen 'post' zusenden. Kommt dann keine
Fehlermeldung wird wieder auf 'edit' geschaltet, andernfalls bleibt es im 'browse' Mode.


Grüße // Martin

mkinzler 30. Dez 2008 22:23

Re: Interbase Update sperren realisierem
 
Zitat:

as ein User einen gerade in Bearbeitung befindlichen Datensatz nicht bearbeiten kann
ist bei Delphi mit FB eine reine Katastrophe
Wie meinst du das? Änderungen in eine Tranaktion sind für andere Transaktionen doch nicht sichtbar. Und welchen Sinn würde eine parallele Änderung machen ( würde das ganze Transaktionsprinzip adabsurdum führen).
Ich kann mir nicht vorstellen, das dies bei Oracle anders ist.

mschaefer 31. Dez 2008 08:55

Re: Interbase Update sperren realisierem
 
Moin, moin,

Wenn man da ein Grid hat gibt es banal Zeilen die sind nicht zu ändern und andere eben doch.

Es da ganz einfach so, dass Datensätze die in Bearbeitung nur zum lesen für andere im Zugriff sind. Man kann nicht in den Editmodus gehen. Das scheint mir auch sinnvoll, denn wenn der zweite Nutze erst am Ende seiner Eingaben erfährt, dass er sie nicht speichern kann, dann hat er da banal Zeit reingesteckt und eventuell auch Daten verloren.

Grüße // Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.
Seite 1 von 2  1 2      

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