Laden...

Parallele Zugriffe

Erstellt von Markus vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.541 Views
M
Markus Themenstarter:in
5 Beiträge seit 2004
vor 18 Jahren
Parallele Zugriffe

Hallo,

ich benötige einen theoretischen Lösungsansatz für folgendes Problem (optimal wären Entwurfsmuster) :

ich habe ein zentral gespeichertes dokument (z.b. in datenbank oder textdatei,...).
2 nutzer greifen gleichzeitig auf dieses dokument zu, bearbeiten es und speichern es nach der bearbeitung wieder ab. wie kann man dies ermöglichen, ohne dass die änderungen eines nutzers durch die änderungen des anderen überschrieben werden (das enddokument soll die änderungen von nutzer 1 + nutzer 2 enthalten)

...würde mich über zahlreiche antworten freuen 😉

Markus

210 Beiträge seit 2005
vor 18 Jahren

Dann brauchst du "irgendetwas", was transaktionsorientiert (ACID) den Zugriff auf die Ressource kapselt. Bei den meisten DBMS ist das ja schon dabei.

Blog

Portable WebDAV Library

Windows Server Advanced Power Management
Erweitertes Energie-Management unter Windows

P
939 Beiträge seit 2003
vor 18 Jahren

Das Ergebnis müsste sein, dass der erste Editor seine Änderungen speichern kann, der zweite jedoch erstmal Pech gehabt hat. Da zwischendurch das Dokument geändert wurde, darf seine Version nicht einfach die andere überschreiben.

Dass sich zwischenzeitlich was in der Datenbank geändert hat, muss erstmal irgendwie festgestellt werden. Entweder man merkt sich das Originaldokument im Speicher und vergleicht es vor dem Speichern der Änderungen mit dem Dokument in der Datenbank oder man führt eine zusätzliche Versions- oder Zeitstempel-Spalte ein, die bei jedem Speichervorgang verglichen und aktualisiert wird, Stichwort: optimistische Transaktion.

Bleibt noch das Problem wie in so einem Fall weiter zu verfahren ist. Man könnte dem Editor die Option anbieten, die Änderungen in der Datenbank mit seinen Änderungen vor dem Speichern zusammenzuführen. Der Editor guckt dann nochmal drüber ob das Ergebnis in Ordnung geht und versucht ein zweites Mal zu speichern. Das funktioniert allerdings nur mit Textdateien. Bei Word-Dokumenten oder ähnlichem wird es wahrscheinlich Probleme geben.

Gruss
Pulpapex

M
Markus Themenstarter:in
5 Beiträge seit 2004
vor 18 Jahren

Danke für Eure schnelle Hilfe!
Habt mir sehr geholfen!

Nur noch eine Frage.
Kennt Ihr Entwurfsmuster, die sich dieser Problematik annehmen?

P
939 Beiträge seit 2003
vor 18 Jahren

Optimistische Transaktionen ist quasi ein Entwurfsmuster. Die Umsetzung ist nämlich Aufgabe der Anwendung (oder eines Frameworks) und nicht der Datenbank.

Am besten du suchst mal im Netz, findet man ziemlich viel zu.

Ansonsten ist es fast ausgeschlossen, dass zwei Benutzer an einem Dokument editieren und ihre Änderungen automatisch in der Datenbank zusammengeführt werden. Dazu ist in den meisten Fällen manueller Eingriff erforderlich. Der langsamere Editor muss die Sache ausbügeln.

Eine Echtzeitanwendung, wo beide Benutzer direkt sehen können, was die Gegenseite macht, wäre noch eine Idee. Ist aber bestimmt nicht leicht umsetzbar. Bei drei Editoren wirds dann langsam unübersichtlich. 😉

210 Beiträge seit 2005
vor 18 Jahren

Mal eine andere Frage: Hast du eine DB, oder einzelne Dateien? Denn von den meisten Datenbanken wird das automatisch gemacht (DBMS). Da würdest du dir nen Haufen Arbeit sparen. 😉

Blog

Portable WebDAV Library

Windows Server Advanced Power Management
Erweitertes Energie-Management unter Windows

P
939 Beiträge seit 2003
vor 18 Jahren

Da muss ich widersprechen, das kann eine Datenbank nicht leisten.

Es sei denn, es gibt schon welche, die optimistische Transaktionen unterstützen. Per Wertevergleich, ... wäre vielleicht denkbar.

Eine (pessimistische) Transaktion kann sehr, sehr lange laufen, wenn es währenddessen Benutzer-Interaktionen gibt. Andere Transaktionen können in der Zeit nicht auf die Daten zugreifen (ab Isolationslevel "Repeatable Read"). D.h. der zweite Editor wird blockiert, bis der erste fertig ist.

Selbst niedrigere Isolationslevel machen nicht viel Sinn. Die Daten können dann zwar parallel geladen und bearbeitet werden. Sie überschreiben sich aber immer noch beim Speichern.

I
1.739 Beiträge seit 2005
vor 18 Jahren

Nur aus Neugier, wenn sich Änderungen der Benutzer am Dokument überschneiden, wer soll gewinnen(erster oder letzter)? Oder soll die Bearbeitung gleicher Dokumentabschnitte verhindert werden?
Vielleicht wäre Zeichenweises pessimstisches Locking eine Lösung, wobei jede Änderung des Dokuments und die Position der Cursor aller Benutzer den anderen Clients mitübermittelt werden müsste.

M
Markus Themenstarter:in
5 Beiträge seit 2004
vor 18 Jahren

Hier die komplette Geschichte...:

Ich bin momentan mit der Konzeption eines Intranet-Portals für Produktionsteams beschäftigt.

die Konzeptionelle Phase (Bedarfsermittlung) besteht aus 3 Schritten:

  1. Informationsbedarfe internationaler Produktionsteams ermitteln.

  2. aus den Informationsbedarfen mögliche Problemstellungen für die Softwaretechnische Umsetzung ableiten.

  3. zu den Problemen passende Entwurfsmuster finden.

  4. Erstellung eines Mustersystems

Wie gesagt, eines der noch nicht gelösten Probleme ist der parallele Zugriff auf Dokumente. Natürlich wäre eine mögliche Lösung das Sperren des geöffneten Dokuments. Da ich in dieser Phase die Probleme noch auf der höchsten Abstraktionsebene betrachte ist es nicht unbedingt erforderlich auf Details wie Datenquelle oder ähnliches einzugehen. Ich wollte nur wissen ob es bereits fertige Lösungsansätze bzw. Alternativen gibt.

Ich werde mir eure Vorschläge auf jeden Fall genauer anschauen und fleißig googeln.
Vielen Dank nochmals!

C
64 Beiträge seit 2005
vor 18 Jahren

Hallo Markus,

du hast eigentlich das gleiche Problem wie ein Codeverwaltungssystem (z.B. CVS, subversion, Sourcesafe usw.) In der Subversion Doku gibt es da eine schöne Erklärung, schau sie dir einfach mal an.

http://svnbook.red-bean.com/en/1.1/ch02s02.html#svn-ch-2-sect-2.2

Grüße Sven

P
939 Beiträge seit 2003
vor 18 Jahren

Die einfachste Lösung ist wahrscheinlich wirklich, ein bestehendes Versionierungssystem als Backing Store zu verwenden. Das Html-basierte WebDAV-Protokoll könnte man sich auch mal genauer anschauen: "Web-based Distributed Authoring and Versioning".

3.728 Beiträge seit 2005
vor 18 Jahren
Transaktionen

grundsätzlich gibt es kurzlaufende und langlaufende Transaktionen.

Kurzlaufende werden meistens von der Datenbank abgedeckt. Man startet eine Transaktion und führt in ihrem Kontext Änderungen durch. Bei einem Fehler wird alles Rückgängig gemacht (Rollback). Am Ende wird Commit aufgerufen. Damit werden die Änderungen dauerhaft gespeichert. Viele Datenbanken unterstützen sogenannte Isolationsstufen. Diese bestimmen, welche Sperren auf welche Daten gesetzt werden. Auch wenn die Änderungen selbst ganz oder garnicht durchgeführt werden, können bei einer niedrigen Isolationsstufe die Daten während der Transaktion gelesen werden. Das passiert besonders häufig, wenn viele Benutzer gleichzeitig Daten lesen. Da aber gerade eine Transaktion läuft, kann man erst nach einem Rollback oder Commit sagen, ob die gelesenen Daten wirklich stimmen. Das erhöhen der Isolationsstufe führt zu kompletten Lesesperren auf die Daten (vielleicht sogar auf ganze Tabellen), was allerdings alle anderen Zugriffe beeinträchtigt. Bei einer hohen Isolationsstufe müssen alle warten, bis die Transaktion abgeschlossen ist, bis sie ihre Abfrageergebnisse bekommen. Die Sanduhr lässt grüßen. Es gibt also keine Generallösung. Es ist vom Anwendungsfall, der verwendeten Datenbank und der Anzahl der Benutzer abhängig.

http://www.microsoft.com/germany/msdn/library/net/ImplementierenVonDatenbanktransaktionenMitMicrosoftNET.mspx

Wenn nun allerdings Transaktionen über mehrere Datenbanken und/oder andere Ressourcen laufen sollen, müssen verteilte Transaktionen eingesetzt werden. Dazu ist aber ein Transaktionsmanager nötig, der die Transaktion auf den einzelnen Ressourcen kontrolliert. Bei Windows ist das der DTC (Distributed Transaction Coordinator). Am einfachsten nutzt man den über COM+ Komponenten (Seit .NET heißt COM+ Enterprise Services). Für Ressourcen, die standardmäßig keine Transaktionen unterstützen, wie z.B. das Dateisystem können kompensierende Ressourcen-Manager geschrieben und eingebunden werden. Diese implementieren die ACDI-Eigenschaften so gut wie möglich mit der jeweiligen Ressource.

http://www.microsoft.com/germany/msdn/library/components/InformationenZuEnterpriseServicesCOMPlusInNET.mspx

Langlaufende Transaktionen können nicht so restriktiv behandelt werden. Angenommen eine Transaktion dauert Tage oder Wochen, weil menschliche Entscheidungen eingebuden sind. Es wäre undenkbar Datenbanksperren über so lange Zeiträume aufrechtzuerhalten. Einzelne Teile können in kleine Transaktionen gepackt werden. Der Rest muss über Kompensationsmechanismen abgedeckt werden.

Am besten die Logik im BizTalk Server 2004 aufhängen. Der kann kurzlaufende und langlaufende Transaktionen verarbeiten. Auf jeden Fall mal den folgenden Link anschauen:

http://www.microsoft.com/biztalk/evaluation/overview/biztalkserver.mspx