![]() |
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. |
Re: Interbase Update sperren realisierem
Hallo,
der Interbase/Firebird arbeitet mit einer Multigenerationenarchitekur ![]() 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:
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.
UPDATE tabelle SET vname='Delphi', nname='Praxis' WHERE (vname=alter_vorname) and (nname=alter_nachname)
|
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. |
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. ;) |
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.
|
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 ---- ![]() |
Re: Interbase Update sperren realisierem
Zitat:
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
|
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 |
Re: Interbase Update sperren realisierem
Zitat:
Ich kann mir nicht vorstellen, das dies bei Oracle anders ist. |
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 05:51 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