Datensatz sperren bei mehreren Benutzern

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
MichaSp
Beiträge: 2
Registriert: Do 6. Mär 2014, 12:19

Datensatz sperren bei mehreren Benutzern

Beitrag von MichaSp »

Hallo liebe Foristen,

ich bin Neueinsteiger was das Programmieren mit Lazarus betrifft. Daher hoffe ich, dass ihr mir bei meinem Problem helfen könnt. Folgendes möchte ich tun:

Ich greife mit meinem Programm (mithilfe von Zeos) auf eine MySQL - Datenbank zu (MySQL 5.6 Server). Die Daten werden dann in einer einfachen grid auf meiner Oberfläche angezeigt. Das klappt soweit auch alles ohne Probleme. Nun möchte ich dem Anwender die Möglichkeit geben, einen einzelnen Datensatz zu bearbeiten. Dafür taucht beim Klick auf den entsprechenden Button eine neues Formular mit DBEdit-Felder auf, sodass der vorher aktive Satz bearbeitet werden kann. Da allerdings mehrere Nutzer gleichzeitig auf die Datenbank zugreifen können, würde ich diesen Datensatz gerne sperren, solange das Fenster offen ist. Soweit ich das verstanden habe, müsste das mit select ... for update gehen. Deshalb habe ich eine 2. Query eingefügt, die nur den einen aktiven Datensatz mit select .. for update öffnet und die DBEdit-Felder auf diese verlinkt. (Ich wollte ja nicht die ganze Tabelle sperren)
Irgendwie hilft das aber herzlich wenig, da immer noch zwei benutzer gleichzeitig die Daten ändern können. Was kann ich da tun?
Ich hoffe es ist einigermaßen verständlich was mein Problem ist.

Für jeder Art von Hilfe bin ich dankbar :)

Grüße, Micha

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Datensatz sperren bei mehreren Benutzern

Beitrag von Michl »

Ich nutze z.Zt. kein MySQL (bin eher ein PostgreSQL-Fan - kann es daher nicht testen), aber ein "SELECT ... LOCK IN SHARE MODE" sollt es IMHO tun http://dev.mysql.com/doc/refman/5.5/en/ ... reads.html

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Datensatz sperren bei mehreren Benutzern

Beitrag von Antrepolit »

Da Transaktionen in MySQL per default deaktiviert sind, musst du diese erst einmal aktivieren und dich damit auseinandersetzen. Ferner musst du den korrekten Transaction Isolation Level setzen. Ohne Transaktionen bringt SELECT FOR UPDATE nämlich nichts, da der Lock erst durch ein COMMIT oder ROLLBACK wieder freigegeben wird.
Grüße, Antrepolit

care only if your os is really burning

MichaSp
Beiträge: 2
Registriert: Do 6. Mär 2014, 12:19

Re: Datensatz sperren bei mehreren Benutzern

Beitrag von MichaSp »

Hallo,

wenn auch reichlich verspätet wollte ich mich noch für eure Antworten bedanken. Da mir das mit den Transaktionen für den Einstieg zu kompliziert war, habe ich jetzt einfach eine zusätzlich Spalte in meiner Tabelle hinterlegt in der ich den Benutzer schreibe, wenn dieser einen Datensatz bearbeitet. Mit einer einfachen If- Anweisung kann ich diese info dann abfragen und Datensatz intern als "gesperrt" händeln. Muss ich nur aufpassen, dass ich das an allen wichtigen Stellen prüfe, schien mir aber leichter zu sein :).

Beste Grüße, Micha

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Datensatz sperren bei mehreren Benutzern

Beitrag von mschnell »

Hört sich wie eine verdammt schlechte Idee an :(

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Datensatz sperren bei mehreren Benutzern

Beitrag von Christian »

muss ich dir mal zustimmen michael
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten