Grundsätzliche Frage: Mysql und mehrere User
-
- Beiträge: 77
- Registriert: Fr 27. Jul 2007, 08:43
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Nahe Flensburg
Grundsätzliche Frage: Mysql und mehrere User
Hallo,
mal ne grundsätzlich Frage:
Ich hab ne kleine Anwendung geschrieben mit Lazarus-Mysql (Zeos). Ist ne kleine Kundendatenbank (Name, PLZ, Strasse Ort etc). Allerdings tiefere Kenntnisse...
Das Prog kann ich unter Linux mehrfach starten. Wenn ich mit 2 Instanzen den gleichen Datensatz ändere, "gewinnt" immer der, der als letzter den Datensatz verläßt (ApplyUpdates).
Für mich ist das eher trivial, aber wie wird das für echte Mehrplatz-Systeme mit mysql realisiert. Eigentlich müßte doch jeder Datensatz, der aktuell von irgendjemand bearbeitet wird für andere gesperrt werden oder nur lesbar sein, oder ???
MfG, P. Jensen
mal ne grundsätzlich Frage:
Ich hab ne kleine Anwendung geschrieben mit Lazarus-Mysql (Zeos). Ist ne kleine Kundendatenbank (Name, PLZ, Strasse Ort etc). Allerdings tiefere Kenntnisse...
Das Prog kann ich unter Linux mehrfach starten. Wenn ich mit 2 Instanzen den gleichen Datensatz ändere, "gewinnt" immer der, der als letzter den Datensatz verläßt (ApplyUpdates).
Für mich ist das eher trivial, aber wie wird das für echte Mehrplatz-Systeme mit mysql realisiert. Eigentlich müßte doch jeder Datensatz, der aktuell von irgendjemand bearbeitet wird für andere gesperrt werden oder nur lesbar sein, oder ???
MfG, P. Jensen
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- 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: Grundsätzliche Frage: Mysql und mehrere User
Mehrusersyteme sind nicht trivial zu bertachten.pjensen hat geschrieben: Für mich ist das eher trivial, aber wie wird das für echte Mehrplatz-Systeme mit mysql realisiert. Eigentlich müßte doch jeder Datensatz, der aktuell von irgendjemand bearbeitet wird für andere gesperrt werden oder nur lesbar sein, oder ???
Um solche Überschneidungen zu vermeiden sind eigene Überlegungen und Techniken nötig.
Du hast grob folgende Möglichkeiten:
A) Es ist so und nicht tun
B) Die Änderung im Rahmen einer Transaktion abwickeln
C) Auf Programmebene sperren einbauen
D) Auf (externe) Änderungen in der Datenmenge beim Update reagieren
Bei B kannst du das relativ einfach mit den vorhandenen Komponenten machen. Sprich eine Transaktion öffnen und wenn du fertig bist die Transaktion beenden.
C nimmt man meistens dann wenn Transaktionen nicht vom System unterstützt werden oder bei Desktopsystemen.
D ist in Datenbankverbindungskomponente verwirklicht. Stichwort Wie löse ich Konflikte beim speichern in der Datenbank.
Persöhnlich habe ich derzeit noch zuwenig mit Lazarus in dem Bereich gearbeitet, mein Wissen ist da noch zu Delphi & ADO & MsSQL lastig.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Lazarusforum e. V.
- Beiträge: 2809
- Registriert: Sa 9. Sep 2006, 18:05
- OS, Lazarus, FPC: Linux (L trunk FPC trunk)
- CPU-Target: 64Bit
- Wohnort: Dresden
- Kontaktdaten:
Echter Mehrclient-betrieb ist ohnehin Sache das Datenbankservers. Dieser muss das ganze stehts konsistent verwalten und auch entsprechend reagieren, wenn mehrer Personen den gleichen Datensatz bearbeiten. Aber wenn du ihn bspw. mit UPDATE aktualisierst, ist ja klar, das das letzte Update übernohmen wird, weil dieses ja das vorhergehende Überschreibt ist ja aber letztlich auch der Sinn, wenn etwas aktualisiert wird.
Mehrere Transaktionen eines Datensatzes werden bis zum Commit gecacht und anschließend aufgelöst. Aber gerade dieses Transaktionhandling ist ein Buch für sich.
Mehrere Transaktionen eines Datensatzes werden bis zum Commit gecacht und anschließend aufgelöst. Aber gerade dieses Transaktionhandling ist ein Buch für sich.
Johannes
-
- Beiträge: 131
- Registriert: Sa 5. Apr 2008, 17:57
- OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
- CPU-Target: 32Bit/64Bit
- Wohnort: Ulm
Hallo,
ich weiss nicht ob dieser Thread überhaupt noch gelesen wird...
Bin jetzt erst dazu gekommen, habe bisher nur auf dem internat. Lazarusforum geschaut.
Mit MySQL geht es grundsätzlich schon einen echten Multiuserbetrieb mit Transaktionen abzuwickeln.
Als Erstes wird dazu eine richtige StorageEngine von MySQL benötigt die auch Transaktionen versteht. Ansonsten geht mit der Standard MyISAM Engine nur ein Table-Lock.
Der erste User der einen Datensatz bearbeiten möchte sollte für ein Update - und nur dies ist kritisch- den Datensatz sperren können. Der nächste User der darauf zugreifen möchte bekommt dann eine Fehlermeldung solange bis der Datensatz wieder freigegeben wurde.
Die transaktionssicheren Tabellen sind bei MySQL die InnoDB Tabellen. Das kann bei der Anlage der Tabellen angegeben werden oder über ein Alter Table geändert werden.
Dann muss für das Update ein spezielles Schlüsselwort verwand werden.
Das würde dann zum Beispiel so lauten:
"select * from person where pid=12 for update"
Entscheidend ist hier das "for update" damit weiss MySQL, dass der Datensatz geperrt werden muss.
Die Sperre gilt solange bis von der Session ein "COMMIT" oder ein "ROLLBACK" kommt oder die Session abgebrochen wird. Das Letztere ist gleichbedeutend mit einem "ROLLBACK".
Das Ganze funktioniert wunderbar mit MySQL 5.X und Zeos.
Hoffe damit geholfen zu haben.
Gruss,
Tibor
ich weiss nicht ob dieser Thread überhaupt noch gelesen wird...
Bin jetzt erst dazu gekommen, habe bisher nur auf dem internat. Lazarusforum geschaut.
Mit MySQL geht es grundsätzlich schon einen echten Multiuserbetrieb mit Transaktionen abzuwickeln.
Als Erstes wird dazu eine richtige StorageEngine von MySQL benötigt die auch Transaktionen versteht. Ansonsten geht mit der Standard MyISAM Engine nur ein Table-Lock.
Der erste User der einen Datensatz bearbeiten möchte sollte für ein Update - und nur dies ist kritisch- den Datensatz sperren können. Der nächste User der darauf zugreifen möchte bekommt dann eine Fehlermeldung solange bis der Datensatz wieder freigegeben wurde.
Die transaktionssicheren Tabellen sind bei MySQL die InnoDB Tabellen. Das kann bei der Anlage der Tabellen angegeben werden oder über ein Alter Table geändert werden.
Dann muss für das Update ein spezielles Schlüsselwort verwand werden.
Das würde dann zum Beispiel so lauten:
"select * from person where pid=12 for update"
Entscheidend ist hier das "for update" damit weiss MySQL, dass der Datensatz geperrt werden muss.
Die Sperre gilt solange bis von der Session ein "COMMIT" oder ein "ROLLBACK" kommt oder die Session abgebrochen wird. Das Letztere ist gleichbedeutend mit einem "ROLLBACK".
Das Ganze funktioniert wunderbar mit MySQL 5.X und Zeos.
Hoffe damit geholfen zu haben.
Gruss,
Tibor
-
- Beiträge: 489
- Registriert: Sa 5. Apr 2008, 09:37
- OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
- CPU-Target: 32Bit /64 Bit
- Wohnort: Nähe Freiburg i.Br.
Re: Grundsätzliche Frage: Mysql und mehrere User
da will ich mich grad mal dranhängen.
ob per autocommit oder per transaction die daten zu speichern funktioniert einwandfrei.
bei mehreren Arbeitsplätzen habe ich aber das Problem, dass die "passiven" Plätze von den geänderten daten in der DB nix mitbekommen.
Wie ist das zu handeln?
Gruss KH
ob per autocommit oder per transaction die daten zu speichern funktioniert einwandfrei.
bei mehreren Arbeitsplätzen habe ich aber das Problem, dass die "passiven" Plätze von den geänderten daten in der DB nix mitbekommen.
Wie ist das zu handeln?
Gruss KH
-
- 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: Grundsätzliche Frage: Mysql und mehrere User
Im normalfall müssen sie das nicht sofort Beispiel Auftragsverwaltung Wenn man nach neuen auftrtägen sucht dann eh per abfrage auf die DB womit man immer den letzten Status der DB bekommt, ansonsten muss ein Benutzer nicth wissen was an neuen Aufträgen erfasst wurde.
Bei Sachen wie Mail system oder Kalendar kann man entweder periodisch abfragen was sich geändert hat oder man erstellt Trigger, die jedoch nicht von jedem DB System unterstützt werden.
Bei Sachen wie Mail system oder Kalendar kann man entweder periodisch abfragen was sich geändert hat oder man erstellt Trigger, die jedoch nicht von jedem DB System unterstützt werden.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- Beiträge: 489
- Registriert: Sa 5. Apr 2008, 09:37
- OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
- CPU-Target: 32Bit /64 Bit
- Wohnort: Nähe Freiburg i.Br.
Re: Grundsätzliche Frage: Mysql und mehrere User
Christian hat geschrieben:Im normalfall müssen sie das nicht sofort Beispiel Auftragsverwaltung Wenn man nach neuen auftrtägen sucht dann eh per abfrage auf die DB womit man immer den letzten Status der DB bekommt, ansonsten muss ein Benutzer nicth wissen was an neuen Aufträgen erfasst wurde.
Bei Sachen wie Mail system oder Kalendar kann man entweder periodisch abfragen was sich geändert hat oder man erstellt Trigger, die jedoch nicht von jedem DB System unterstützt werden.
und was ist in der Stammdatenverwaltung, beispielsweise beim ändern von Kundendaten?
Gruss KH
-
- 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: Grundsätzliche Frage: Mysql und mehrere User
Was soll damit sein, wenn User X etwas an seinem Kunden ändert muss nicht gleich der ganze vertrieb darüber bescheid wissen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- Beiträge: 489
- Registriert: Sa 5. Apr 2008, 09:37
- OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
- CPU-Target: 32Bit /64 Bit
- Wohnort: Nähe Freiburg i.Br.
Re: Grundsätzliche Frage: Mysql und mehrere User
Christian hat geschrieben:Was soll damit sein, wenn User X etwas an seinem Kunden ändert muss nicht gleich der ganze vertrieb darüber bescheid wissen.
ich danke dir,
Gruss KH
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- 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: Grundsätzliche Frage: Mysql und mehrere User
[quote="khh]und was ist in der Stammdatenverwaltung, beispielsweise beim ändern von Kundendaten?[/quote]
Ich verstehe jetzt dein Problem nicht ganz.
Es ist ganz normal, das in einer Multiuserdatenbank sich Daten ändern, auch Stammdaten.
Diese Situation musst du ganz einfach berücksichtigen, grob gesagt:
Wenn es heikel wird, musst du mit Transaktionen und somit Sperren arbeiten, damit die keiner die Daten unterm hintern wegändert. Oder du berücksichtigst die Probleme beim Einbringen der Daten und löst die Konflikte auf. Oder du holst dir halt die Daten immer aktuell, aber was ist aktuell ? Jetzt, vor 1ms, vor 1 Tag ?
Ich verstehe jetzt dein Problem nicht ganz.
Es ist ganz normal, das in einer Multiuserdatenbank sich Daten ändern, auch Stammdaten.
Diese Situation musst du ganz einfach berücksichtigen, grob gesagt:
Wenn es heikel wird, musst du mit Transaktionen und somit Sperren arbeiten, damit die keiner die Daten unterm hintern wegändert. Oder du berücksichtigst die Probleme beim Einbringen der Daten und löst die Konflikte auf. Oder du holst dir halt die Daten immer aktuell, aber was ist aktuell ? Jetzt, vor 1ms, vor 1 Tag ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 489
- Registriert: Sa 5. Apr 2008, 09:37
- OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
- CPU-Target: 32Bit /64 Bit
- Wohnort: Nähe Freiburg i.Br.
Re: Grundsätzliche Frage: Mysql und mehrere User
af0815 hat geschrieben:Wenn es heikel wird, musst du mit Transaktionen und somit Sperren arbeiten, damit die keiner die Daten unterm hintern wegändert.
genau das war meine befürchtung.
Wenn 2 Benutzer gleichzeitig Stammdaten ändern, wollte ich diese jeweils beim andern aktuallisiert anzeigen.
Ich denke jetzt aber, dass das relativ aufwändig ist, und man die Verantwortung wohl an den User abtreten kann.
ich überlege noch, ob es sinn macht die in Bearbeitung befindlichen ds zu sperren und dem "zu spät kommenden" user die Sperre anzuzeigen.
Gruss KH
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- 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: Grundsätzliche Frage: Mysql und mehrere User
Eigenlich sollte nur dann der User 'belästigt' werden, wenn seine Änderung nicht ok ist. Was man in keinem Fall machen darf ist , dem User ein Transaktion starten, editieren und dann abschliessen lassen. Das kann ins Auge gehen.khh hat geschrieben:... ich überlege noch, ob es sinn macht die in Bearbeitung befindlichen ds zu sperren und dem "zu spät kommenden" user die Sperre anzuzeigen ...af0815 hat geschrieben:Wenn es heikel wird, musst du mit Transaktionen und somit Sperren arbeiten, damit die keiner die Daten unterm hintern wegändert.
Was ist der hat inzwischen einen Telefonanruf und vergisst dann die Transaktion zu beenden

Meine Erfahrung ist: Lass den User nach Änderungen sofort auf den 'Speichern' Button drücken. Wenn er die Daten nicht speichern kann, weil wer was im Hintergrund geändert hat, so sage es ihm sofort und nicht 100 Eingaben später und du hast deine Ruhe.
Ein der vielen Möglichkeit Änderungen zu erkennen, ist Timestamps in der Zeile in der DB zu speichern und bei jeder Änderung, diesen zwangsweise (durch den Server, Trigger) zu ändern. Damit bekommst du jede Änderung mit.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).