Hallo Forum,
diese Frage betrifft kein aktuelles Problem, sondern mich interessiert die allgemeine Vorgehensweise.
Vor einiger Zeit, damals habe ich gerade angefangen mit PostgreSQL zu arbeiten, habe ich mir Gedanken gemacht wie man wohl Datensätze sperren kann um möglichst effektiv arbeiten zu können.
Als Beispiel habe ich folgende Situation konstruiert:
Nehmen wir an wir sprechen von einer Software für Kinos. Bestandteil dieser Software ist natürlich auch das Drucken der Eintrittskarten. Im Hintergrund muss natürlich der etwaige Sitz gesperrt werden.
Jetzt startet also der große neue Blockbuster, es ist Freitag 19:45 Uhr und alle vier Kassen sind geöffnet um Karten für die Abendvorstellung zu verkaufen.
In dieser Situation ist es sehr wahrscheinlich, dass es mehrere Zugriffe auf den selben Datensatz (Sitzplatz in einer Vorstellung) geben kann, trotzdem ist es wichtig, dass es keine falsche Auswertung gibt.
Folgende Lösung funktioniert unter PostgreSQL:
Der Client der einen, oder mehrere Sitze, reservieren will startet eine Transaktion und führt danach SELECT sitz FOR UPDATE aus, checkt ob diese Sitze schon reserviert sind, führt (falls sie es nicht sind) ein update aus und sendet den commmit.
Das ganze könnte in etwas so aussehen:
Wenn zeitgleich ein anderer Client versucht diese Plätze zu reservieren stoppt die Abfrage bei dem SELECT FOR UPDATE weil dieser Befehl offensichtlich eine Datensatzsperrung vornimmt. Die Abfrage läuft weiter sobald die andere Anfrage abgeschlossen ist und selektiert dabei das Ergebnis der ersten Abfrage.
Somit ist eine Konsistenz der Daten absolut gegeben.
Würdet ihr in diesem Fall ähnlich vorgehen?
Was genau macht ihr, wenn es sich um Fälle handelt die weniger kurzfristig mit Daten arbeiten? Zum Beispiel wenn jemand einen Datensatz aus dem Kundenstamm einer Warenwirtschaft bearbeiten würde. Würdet ihr dann eine Verbindung herstellen, eine Transaktion beginnen und die Verbindung die ganze Zeit offen lassen um den Datensatz vor einen Schreibzugriff durch andere Clients zu schützen?
Zuletzt noch eine Frage:
Wie würde man so etwas wohl unter Hibernate angehen? Dort ist man ja für die Verbinungen selber nicht mehr verantwortlich.
Einen schönen Wochenanfang!
Sparrow
diese Frage betrifft kein aktuelles Problem, sondern mich interessiert die allgemeine Vorgehensweise.
Vor einiger Zeit, damals habe ich gerade angefangen mit PostgreSQL zu arbeiten, habe ich mir Gedanken gemacht wie man wohl Datensätze sperren kann um möglichst effektiv arbeiten zu können.
Als Beispiel habe ich folgende Situation konstruiert:
Nehmen wir an wir sprechen von einer Software für Kinos. Bestandteil dieser Software ist natürlich auch das Drucken der Eintrittskarten. Im Hintergrund muss natürlich der etwaige Sitz gesperrt werden.
Jetzt startet also der große neue Blockbuster, es ist Freitag 19:45 Uhr und alle vier Kassen sind geöffnet um Karten für die Abendvorstellung zu verkaufen.
In dieser Situation ist es sehr wahrscheinlich, dass es mehrere Zugriffe auf den selben Datensatz (Sitzplatz in einer Vorstellung) geben kann, trotzdem ist es wichtig, dass es keine falsche Auswertung gibt.
Folgende Lösung funktioniert unter PostgreSQL:
Der Client der einen, oder mehrere Sitze, reservieren will startet eine Transaktion und führt danach SELECT sitz FOR UPDATE aus, checkt ob diese Sitze schon reserviert sind, führt (falls sie es nicht sind) ein update aus und sendet den commmit.
Das ganze könnte in etwas so aussehen:
Wenn zeitgleich ein anderer Client versucht diese Plätze zu reservieren stoppt die Abfrage bei dem SELECT FOR UPDATE weil dieser Befehl offensichtlich eine Datensatzsperrung vornimmt. Die Abfrage läuft weiter sobald die andere Anfrage abgeschlossen ist und selektiert dabei das Ergebnis der ersten Abfrage.
Somit ist eine Konsistenz der Daten absolut gegeben.
Würdet ihr in diesem Fall ähnlich vorgehen?
Was genau macht ihr, wenn es sich um Fälle handelt die weniger kurzfristig mit Daten arbeiten? Zum Beispiel wenn jemand einen Datensatz aus dem Kundenstamm einer Warenwirtschaft bearbeiten würde. Würdet ihr dann eine Verbindung herstellen, eine Transaktion beginnen und die Verbindung die ganze Zeit offen lassen um den Datensatz vor einen Schreibzugriff durch andere Clients zu schützen?
Zuletzt noch eine Frage:
Wie würde man so etwas wohl unter Hibernate angehen? Dort ist man ja für die Verbinungen selber nicht mehr verantwortlich.
Einen schönen Wochenanfang!
Sparrow