Autor Beitrag
c-Jay
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 19.05.14 13:56 
Guten Morgen liebe Community,

ich habe momentan folgendes Problem. Ich habe eine Multi-user Anwendung (Windows Forms, c#) mit der Rechnungen erzeugt werden.
Datenbank sql server 2008 r2

Szenario:

User1 öffnet Rechnung 2014-1.
user2 öffnet rechnung 2014-1.
User1 ändert etwas in Rechnung 2014-1.
user2 hat immernoch den alten Datenstand und will jetzt auch die Rechnung bearbeiten.

Ich würde gern, das user2 automatisch eine Meldung bekommt das er einen alten Datenstand hat, nachdem User1 gespeichert hat.

Habt ihr Ansätze, wie ich dies umsetzten kann ?

Vielen Dank
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 19.05.14 14:07 
Schau dir die SqlDependency Klasse an.
An deinem gewünschten Feature hängt sehr viel Aufwand und benötigt auch einige Resourcen auf dem Server un die Callbacks zu verwalten überleg dir also gut ob dieses Feature wirklich wichtig ist. Im Normalfall ist es absolut ausreichend wenn man beim speichern merkt das bereits jemand anderes die Daten geändert hat.
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mo 19.05.14 23:30 
Huhu.

So schwer ist das ganze m.E.n. nicht.

Hierzu habe ich zwei Ansatzpunkte:

1. Falls es Dir möglich ist, nutze einfach eine weitere Tabelle, in welcher Du einträgst, wenn jemand einen Datensatz öffnet. (id mit einem Feld -> Geöffnet von UserXXX). Ein weiteres Feld könnte nutzbar sein, wenn sich jemand an das Bearbeiten des Datensatzes macht. Sollte nun jemand anderes den Datensatz bearbeiten wollen, müsste ja das Flag gesetzt werden. Aber eine Query auf die id ergibt dan, dass jemand anderes schon bearbeitet. Somit könntes Du hier weitermachen mit Meldungen, evtl. sogar den Benutzer angeben, damit eine schnelle interne Rückfrage erfolgen kann.

2. In jedem Datensatz gibt es ein Feld, in dem ein Schreibschutz gesetzt werden kann. Sobald jemand den Datensatz öffnet, wird das Feld gesetzt (ein Boolean könnte reichen), wenn jemand anderes den Datensatz öffnen möchte, wahlweise dann nur als Read-Only oder eben gar nicht. Wahlweise auch mit Meldung, wer den Datensatz geöffnet hat.


Bei der zweiten Variante ist es nun aber blöderweise so, dass, falls das Programm oder der PC abstürzt, das Feld nicht wieder zurück gesetzt wird. Für den Fall hätte ich noch eine Idee, dass man den PC, der den Datensatz öffnet, mit einem eindeutigen UID in einem Feld hinterlegt. Diese UID muss aber immer für jeden PC gleich bleiben. Ein Ansatz wäre die Mac-Adresse. Nun ist es aber schwierig, zu testen, ob der bestimmte PC noch erreichbar ist. Per Mac-Adresse ist es machbar, per willkürlicher UID nicht mehr so einfach. Ein Clean-Up der Tabelle müsste also irgendwie erfolgen. Oder aber der PC, der das Programm neu öffnet, löscht alle Einträge seiner eigenen UID in der Tabelle. So zu sagen ein aktives sel-Clean-Up.


Ich selbst hatte das auch schon so ähnlich im Einsatz, jedoch mit einem Hash (16-Stellig). Somit benötigte ich keinen Datenbankserver.


Nur Ideen. :)

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 20.05.14 13:24 
c-Jay möchte aber, dass User2 während er das Dokument betrachtet, eine Information bekommt, dass User1 das selbe Dokument bearbeitet hat.

Ich behaupte jetzt einfach mal, dass er Beiden die Möglichkeit lassen will, das Dokument zu bearbeiten, aber auch Beide eine Information erhalten, wenn jemand ANderes es bearbeitet hat.
Und das dürfte schonmal deutlich aufwendiger werden.
Mein Vorgehen sähe ungefähr so aus, dass ich den betroffenen Tabellen die Spalten UpdatedOn und UpdatedBy geben würde. Im Hintergrund muss das dann regelmäßig geprüft werden, ob sich da etwas geändert hat. Dafür lässt sich ja leicht ein Thread erstellen, der dann in bestimmten Abständen eine kleine Abfrage an die Datenbank schickt.

Ob es noch weitere Wege gibt, kann ich nicht sagen, der Tipp von Ralf war mir bisher auch unbekannt, da muss ich erst einmal schauen, was das genau ist.


Dennoch finde ich (auch von Seiten des Nutzers) es besser, wenn ein Dokument immer für einen User gesperrt wird und alle Anderen bekommen nur Lese-Rechte.
Oder sie bekommen beim Speichern die Info, dass sich etwas geändert hat.
Wenn aber nun 50 User an einem Dokument arbeiten (unwahrscheinlich, aber theoretisch möglich), dann würden Alle bei jeder Änderung eines Anderen eine Info bekommen und das kann ziemlich stören.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 20.05.14 14:01 
Zitat:
Ich behaupte jetzt einfach mal, dass er Beiden die Möglichkeit lassen will, das Dokument zu bearbeiten, aber auch Beide eine Information erhalten, wenn jemand ANderes es bearbeitet hat.
Und das dürfte schonmal deutlich aufwendiger werden.


Und das wäre ja auch nur der Anfang ;) Wenn man eine Info bekommt die Daten die man gerade bearbeitet sind geändert worden beginnt ja das Problem erst. Wie kombiniere ich meine Änderungen mit den Änderungen des anderen um was sinnvolles als Ergebnis zu erhalten? Dieser Reconcilation Prozess ist wirklich schwer und kaum generisch lösbar (z.B. a hat Vorname geändert b den Nachnamen macht das in Summe noch Sinn?). Und wenn man das nicht braucht also wenn derjenige der die Info bekommt das sich die Daten im Hintergrund geändert haben nur die Möglichkeit seine Änderungen zu verwerfen bekommt und neu anfangen mus ja dann kann man editieren auch gleich serialisieren und paralleles Bearbeiten untersagen. Da er von Rechnungen spricht finde ich es eh merkwürdig das die nachträglich bearbeitet werden und dann auch noch potentiell mehrmals parallel.

Zitat:
Dennoch finde ich (auch von Seiten des Nutzers) es besser, wenn ein Dokument immer für einen User gesperrt wird und alle Anderen bekommen nur Lese-Rechte.


Das würde ich so allgemein nicht sagen. Optimistisches oder pessimistisches Locking hängt natürlich vom Anwendungsfall an beides hat seine Existenzberechtigung. Da Dokument hier eine Rechnung meint würde ich aber auch eher von letzterem ausgehen.