Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mo 11.04.11 16:54 
Hi,

ich arbeite an einer recht großen Datenbank an der mehrere benutzer Parallel arbeiten können.

In einer UI kann man z.B. Projekt Einstellungen vornehmen und am ende diese via klick auf "Speichern" in der Datenbank speichern. Das hat aber den großen Nachteil dass wenn zwei leute gleichzeitig das Projekt öffnen um daran dinge zu editieren sie sich gegenseitig am Ende beim Speichern überschreiben.

Beispiel:
- User A öffnet die Projekt Einstellungen
- User B öffnet die Projekt Einstellungen
- User A setzt Wert X von 1 auf 3
- User B setzt Wert Y von 2 auf 5
- User A speichert.
- User B speichert.

Jetzt hat X den Wert 1 und Y den Wert 5, denn bei User B hatte X im UI einen Wert von 1 als er es geöffnet hat. Dieser wurde beim speichern dann wieder in die Datenbank eingetragen und hat den von User A gesetzten wert überschrieben.

Jetzt gibt es ja bei MySQL die Möglichkeit Records (nutzen InnoDB) zu locken. Leider kenne ich mich damit überhaupt nicht aus, ich weiß nur das man z.B. ein "SELECT .. AND LOCK" oder so ähnlich machen kann.


Das System wie ich es umsetzen möchte ist folgendes:
Jeder kann die Projekt Einstellungen im ReadOnly Mode öffnen, sobald man etwas editieren will, muß ein "lock" angefordert werden. Alle anderen User sehen dann wenn sie etwas editieren möchten die Meldung "Die Projekt Einstellungen sind von User XYZ in Bearbeitung.". Wenn der User dann fertig ist drückt er speichern, die Daten werden in die Datenbank übertragen und entlockt, so das der nächste User sich den lock holen kann.

Das was geupdated wird in der Datenbank bezieht sich allerdings nicht auf einen record, sondern auf X records in Y Tabellen.

Zusätzlich soll man sehen welcher User aktuell den lock hat, um denjenigen ggf. etwas zu nerven das er schneller arbeitet. Und sollte das Programm oder der Rechner abstürzen sollte es einen Timeout oder irgendwas geben damit die Daten nicht für immer gelockt sind.


Meine Fragen also:

1) Ist das ganze überhaupt via MySQL realisierbar oder muß man dafür etwas eigenes basteln?

2) Wie würde das locken/updaten/entlocken funktionieren? Kenne mich da leider überhaupt nicht aus SQL Syntax technisch.

3) Der SELECT befehl zum abfragen der Project Settings umfasst (via JOIN) weit mehr daten als editiert werden können. Zum Beispiel werden Usernamen angezeigt, aber die werden an komplett anderer stelle editiert. Muß ich das dann in 2 selects aufteilen? Einen für die dinge die gelockt werden müßen und einen für den rest?

4) Ist es möglich den Usernamen oder besser eine UserID zu speichern damit man weiß wer den lock hat?

5) Was macht man wenn der rechner abstürzt und so der user den lock nicht selbst freigeben kann?

Hoffe mir kann wer helfen :)

Vielen Dank,
Aya

_________________
Aya
I aim for my endless dreams and I know they will come true!