Hallo,
in meinem Programm kann ich z. B. eine Datenbank-Tabelle über ein QSqlTableModel anzeigen und die Daten ggf. bearbeiten. Wie funktioniert es jetzt, wenn zwei oder mehr Benutzer mit dem Programm auf die gleiche Datenbank zugreifen?
Einfaches Beispiel, Benutzer eins lässt sich einige Daten anzeigen, macht eine Stunde pause und während dessen verändert Benutzer zwei die Daten. Nach der Pause führt Benutzer eins ebenfalls einige Änderungen durch. Wie kann ich jetzt gewährleisten das die neuen Daten nicht überschrieben werden?
Gibt es das bestimmte Funktionalitäten vom DBMS oder muss ich z. B. jeden Datensatz mit einem Zeitstempel versehen und diesen vor dem Speicher prüfen?
Beste Grüße,
Cyberduck
Gleichzeitiger Datenbankzugriff
Re: Gleichzeitiger Datenbankzugriff
Also die definitive Antwort lautet: kommt drauf an ^^
Was die meisten unterstützen, sind Transaktionen.
Also in deinem Fall:
- U1 öffntet eine Transaktion ... und bekommt damit eine Art Snapshot
- U1 Lässt sich daten Anzeigen ...
...
- U2 öffnet eine Transaktion ... und bekommt auch den Snapshot auf die selben daten
- U2 modifiziert
- U2 macht ein Commit damit wird sein Snapshot zum aktuellen globalen datensatz
...
- U1 macht Änderungen (auf seinem Snapshot)
- U1 will commiten, die DB kriegt mit, das er auf nicht aktuellen Daten arbeit -> Konflikt. Meist gibts nen Error bei dem commit von U1. Manchmal wird auch gemergt, wenn möglich.
Gibt auch noch andere Möglichkeiten, je nach DB System.
Locks !
Du kannst datensätze locken, dann ist garantiert das keiner nen Update und in der Zeit macht.
Die Möglichkeiten sind aber wieder von System zu system verschieden ...
Manche können einzelne Felder einer Tabelle locken ... manche nur komplette Tabellen.
Manche koennen nur Komplettlocks, manche können Read und Writelocks ...
Und die SQL syntax dazu iss auch ned immer gleich ...
Ciao ....
Wenn die Datenbank MutiUserfähig sein soll, dann ja .... Aber datenbanken sind nicht alle gleich ....gibt es das bestimmte Funktionalitäten vom DBMS
Da gibts mehrere Lösungsansaetze ....Benutzer eins lässt sich einige Daten anzeigen, macht eine Stunde pause und während dessen verändert Benutzer zwei die Daten. Nach der Pause führt Benutzer eins ebenfalls einige Änderungen durch. Wie kann ich jetzt gewährleisten das die neuen Daten nicht überschrieben werden?
Was die meisten unterstützen, sind Transaktionen.
Also in deinem Fall:
- U1 öffntet eine Transaktion ... und bekommt damit eine Art Snapshot
- U1 Lässt sich daten Anzeigen ...
...
- U2 öffnet eine Transaktion ... und bekommt auch den Snapshot auf die selben daten
- U2 modifiziert
- U2 macht ein Commit damit wird sein Snapshot zum aktuellen globalen datensatz
...
- U1 macht Änderungen (auf seinem Snapshot)
- U1 will commiten, die DB kriegt mit, das er auf nicht aktuellen Daten arbeit -> Konflikt. Meist gibts nen Error bei dem commit von U1. Manchmal wird auch gemergt, wenn möglich.
Gibt auch noch andere Möglichkeiten, je nach DB System.
Locks !
Du kannst datensätze locken, dann ist garantiert das keiner nen Update und in der Zeit macht.
Die Möglichkeiten sind aber wieder von System zu system verschieden ...
Manche können einzelne Felder einer Tabelle locken ... manche nur komplette Tabellen.
Manche koennen nur Komplettlocks, manche können Read und Writelocks ...
Und die SQL syntax dazu iss auch ned immer gleich ...
Ciao ....
Re: Gleichzeitiger Datenbankzugriff
Hallo,
vielen Dank für die tolle Antwort.
Soweit habe ich alles verstanden, wie Transaktionen mit Qt genutzt werden können ist mir auch klar. Welche Funktionen bietet mir aber Qt um einzelne Felder einer Tabelle zu locken?
Viele Grüße,
Cyberduck
vielen Dank für die tolle Antwort.
Soweit habe ich alles verstanden, wie Transaktionen mit Qt genutzt werden können ist mir auch klar. Welche Funktionen bietet mir aber Qt um einzelne Felder einer Tabelle zu locken?
Viele Grüße,
Cyberduck
Re: Gleichzeitiger Datenbankzugriff
Keine ....Welche Funktionen bietet mir aber Qt um einzelne Felder einer Tabelle zu locken?
Locken ist DB implementierung.
Wird meistens ueber SQL "erweiterungen" erreicht.
LOCK TABLE
oder LOCK TABLE... WHERE ....
sind so beispiele ....
einzige was Qt unterstützt(en muss) ist das SQL statements abzuschicken ...
Ciao ...
Re: Gleichzeitiger Datenbankzugriff
Hi,
sehr schön erklärt, vielen Dank. Jetzt habe ich alles verstanden
Viele Grüße,
Cyberduck
sehr schön erklärt, vielen Dank. Jetzt habe ich alles verstanden
Viele Grüße,
Cyberduck