[Gelöst] Logisches Locking

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
charlytango
Beiträge: 841
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

[Gelöst] Logisches Locking

Beitrag von charlytango »

Hi,

in einem Mehrbenutzersystem soll verhindert werden dass ein User einen Datenbereich bearbeitet den ein anderer gerade in Arbeit hat.

Gelöst werden soll das über eine Tabelle TLocking in welche die BenutzerID, der Bereichsname und ggfs auch die HauptID des Bereichs geschrieben wird um einen Bereich zu locken.

Beispiel: Bei der Kundenbearbeitung bearbeitet man nicht nur den Kunden sondern auch seine Adressen, seine Kontaktdaten etc etc.

Wenn ein User das Formular eines Kunden öffnet und ändern will wird dieser Bereich vorher in TLocking gelocked.

Soweit ist das alles ok und lief über 10 Jahre lang mit dem Konzept.

Nun möchte ich das verbessern und verhindern dass zwei User zeitgleich einen bestimmten Kundenbereich locken können -- aus Laufzeitgründen kann es passieren dass einer das ok bekommt aber der andere auch und beide tragen einen Datensatz in TLocking ein was natürlich unsinnig ist.

Wie stelle ich es in MariaDB an dass so etwas nciht passieren kann.
Ich denke da an Table-Locking das möglichst schnell gehen soll um performant zu sein.

Ablauf:
1.)Frage: Gibt es einen Datensatz in TLocking für den gesuchten Bereich? Falls ja, Ende.
2.) Frage: Ist TLocking gelockt? wenn ja, irgendwie warten (auch nicht geklärt. Benutzerinfo wäre gut)
3.) TLocking fürs schreiben locken (können dann andere User noch gleichzeitig Abfragen ausführen zum Lesen?)
4.) Hat der Lock funktioniert?
5.) Neuen Datensatz eintagen
6.) Unlock TLocking

Und jetzt die Gretchenfrage:Mit welcher Syntax klappt das auf MariaDB/MySQL. Evtl auch mit einer Stored Procedure um das "Prepare" der DB einzusparen?

Das muss wirklich RockSolid sein

THX
Zuletzt geändert von charlytango am Fr 14. Jul 2023, 21:02, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6175
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Logisches Locking

Beitrag von af0815 »

Hm, RockSolid.

Dein Verfahren ist ja bereits RockSolid. :D Ich würde daran nicht viel ändern, nur den DB-Server die Arbeit umhängen:

In TLocking muss der der Bereichsname und der HauptID noch frei sein, dann besetzt buchen - das ganze in einer Transaktion. Nach dem Schreiben in der Tabelle TLocking die Tabelle direkt nach eine Refresh nochmals lesen und schauen ob du den Lock erhalten hast. Wenn ja, darfst du bearbeiten. Wenn der Bereichsname und die HauptID ein Unique Index sind, sollte ja jeder weitere Schreibversuch in einem Fehler enden und somit abgebrochen werden. Erst wenn das wieder gelöscht ist, sollte ein weiterer Versuch erfolgreich sein.

Dein Locking würde dann über die Beschränkung des zusammengesetzten unique Feld auf DB-Ebene funktionieren. Wichtig ist, das das erste Abfragen und Buchen in einer Transaktion ist und somit atomar behandelt wird. Wobei man überlegen muss ob nicht blind buchen alleine auch geht.

Da das 'Locking' über die Tabellenbeschränkung geht, kann du den resultierenden Fehler ja abfangen und auswerten.

Ungelöst wie immer :-) was ist wenn der Lock hängenbleibt :shock: Mein berühmtes, Telefon läutet in der Bearbeitung, Chef macht auf wichtig, Laptopdeckel zu, ab zum Chef und der Lock hängt in alle Ewigkeit :mrgreen:
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 841
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Logisches Locking

Beitrag von charlytango »

Oh danke, das mit dem zusammengesetzten unique Index hat Charme -- THX
af0815 hat geschrieben:
Fr 14. Jul 2023, 08:09
Ungelöst wie immer :-) was ist wenn der Lock hängenbleibt :shock: Mein berühmtes, Telefon läutet in der Bearbeitung, Chef macht auf wichtig, Laptopdeckel zu, ab zum Chef und der Lock hängt in alle Ewigkeit :mrgreen:
Nein, gar nicht -- es gibt natürlich eine Möglichkeit die Locks auch anzeigen zu lassen und aus der Locking-Tabelle zulöschen, womit der Lock dann wieder offen ist. (Rechtegeschützt und auch vom Admin zu machen -- das hat eigentlich immer gut funktioniert).
Mein Problem ist dann eher was ist wenn der Chef wieder den Laptop aufmacht und dort weiterarbeiten will, da brauchts noch eine Sicherheitsstufe. Aber bis dahin ist es schonmal fein.

ZB ein Timer der läuft und einen im Editiermodus befindlichen Bereich absichert und ggfs in den Abbruchmodus zurücksetzt wäre ein Teil davon, aber auch nicht ausreichend.

Socke
Lazarusforum e. V.
Beiträge: 3157
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Logisches Locking

Beitrag von Socke »

charlytango hat geschrieben:
Fr 14. Jul 2023, 18:45
Mein Problem ist dann eher was ist wenn der Chef wieder den Laptop aufmacht und dort weiterarbeiten will, da brauchts noch eine Sicherheitsstufe. Aber bis dahin ist es schonmal fein.

ZB ein Timer der läuft und einen im Editiermodus befindlichen Bereich absichert und ggfs in den Abbruchmodus zurücksetzt wäre ein Teil davon, aber auch nicht ausreichend.
Du kannst vor dem Speichern - idealerweise in der selben Datenbanktransaktion - nachschauen, ob deine Sperre noch da ist.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

charlytango
Beiträge: 841
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Logisches Locking

Beitrag von charlytango »

Ich weiß ja warum ich diesem Forum bin.
Oft sieht man den Wald vor lauter Bäumen nicht.

Antworten