das richtige timing - nur nich immer ;(
Sorgenkind Mech
- programmiertechnik
nabend leutz
ich hab ma wieder ein problem (nerv ich nich langsam?)
und zwar hoffe ich, dass mir jemand bi folgendem problem weiterhelfen kann:
ein teil meines aktuellen projektes besteht aus einer dokumentenverwaltung
dies bedeutet, dass man sie einsehen, bearbeiten, und halt speichern kann
so, das ganze basiert auf html/js/php/mysql
die bearbeitung eines dokumentes erfolgt so:
man kann daten selbst schreiben, blablalba
wenn man aber aus der restlichen db was einfügen will muss ja ein query erfolgen, also wird die site neu geladen, mit den entsprechenden informationen, dabei werden auch alle änderungen gespeichert
soweit kein prob
problematisch wirds, wenn 2 leute das gleiche dokument bearbeiten
also hab ich folgendes gemacht:
beim aufruf wird geprüft, ob die id des dokuments in der tabelle "exclusive" vorhanden ist, wenn ja erscheint ne info, und der benutzer wqird wieder rausgeschmissen
so, wichtig ist nun aber, dass die id des dokumentes beim verlassen des dokuments auch wieder gelöscht wird
also gibbet im <body onunload=fkt()> wo dann per window.open() ein fenster geöffnet wird, dass die entsprechnede id aus der tabelle exclusive wieder löscht
beim reload passiert selbiges, d.h. das dok wird ausgetragem und wieder eingetragen
wenn nun aber die austragung langsamer ist, als die kontrolle, ob es existiert, sprich die id ist zum zeitpunkt der abfrage noch vorhanden, dann wird man natürlich rausgeschmissen, ohne, dass die id gelöscht wird.
dadurch wäre das dokumentz ohne weiteres sozusagn für immer gesperrt
ich hab mir jetz geedacht, ne abfrage reinzubauen, wenn das dokument sozusagen als "in bearbeitung" markiert ist, ob man wirklich fortfahren will
aber letztendlich is das nich der bringer
hat jemand ne andere idee?
wär schön ;)
grüße
Hallo SK Mech,
Deine Vorgehensweise ist nicht zu empfehlen, da sie schlicht extrem störanfällig ist. Es darf in keinem Fall möglich sein, daß ein Fehler beim Client (User Error, System Panic o. ä.) den Server blockiert.
Ich würde das so lösen, daß Du einen Zeitstempel der letzten Änderung an dem Datenbankfeld anbringst und dieses in einem hidden-Feld an den Client übersendest. Beim Eintrag in die Datenbank überprüfst Du später, ob sich zwischenzeitlich etwas verändert hat. Falls dies der Fall ist, gibst Du dem User seine eigene und die nun aktuelle Eintragung mit und fragst, was er tun möchte (mit seiner Änderung überschreiben oder aktuelle Version beibehalten).
Gruß
Eidgenosse
hi "Eidgenosse"
naja, es soll ja garnicht erst möglich sein, dass 2 an ein und dem selben dokument arbeiten, d.h. will user 2 drauf zugreifen bekommt er die meldung, dass user sowieso gerade dran arbeitet, und deshalb die bearbeitung momentan nicht möglich ist
das ganze läuft in einem lokalen netzwerk mit ca. 5 rechnern
jeder benutzer ist eindeutig identifiziert, sodass durch die meldung user 2 genau weiß wer ihn blockiert, ob der linke oder rechte nachbar
wenn das der fall ist, is ja auch alles im grünen breich, wenn jedoch halt das timing nicht stimmt, würde user 1 den fehler bekommen, obwohl er selbst ja nur dran arbeitet, und niemand anders .........
im moment hab ich das so geregelt, dass der benutzer informiert wird, und wählen kann, ob er trotzdem fortfahren möchte
das ganze so zu machen wie du wäre ein riesen aufwand, und denke mal auch beim arbeiten irritierend, wenn der user 1 aufeinmal mitgeteilt bekommt, dass seine arbeit gerade geändert wurde, und das ganeze dann eventuell vershcmelzen ........ ok wär möglich, aber für den user womöglich nicht mehr überschaubar
du musst davon ausgehen, dass da DAUs dran sitzen .........
trotzdem danke für deine idee
gruß
Hi mech, (warum eigentlich sorgenkind?)
Ich würde eine extra Tabelle Locks einrichten. In dieser Tabelle werden alle Artikel die bearbeitet werden gespeichert. In der Form in etwa so: (tut mir Leid für alle die nicht meine Schriftart benutzen, aber ich weiß nicht wie ich es jetzt besser darstellen soll)
+---------------------------------------------------------------+
|Tabelle Locks |
+-----------+---------+---------------+-------------------------+
|artikel_id | user_id | timestamp | (*art des Locks) |
+-----------+---------+---------------+-------------------------+
|2300 |123 |20030115001843 |lese-oder schreib-verbot |
+-----------+---------+---------------+-------------------------+
|aaaaaaaaaaa|uuuuuuuuu|tttttttttttttt |read/write |
+-----------+---------+---------------+-------------------------+
Wenn jetzt ein User einen Artikel aendert, wird ein entsprechender Lock eingetragen, wenn er fertig ist, wird er wieder ausgetragen. Wenn der User den Browser während einer Aenderung geordnet schließt, wird ein Script gestarted, dass den Lock wieder löscht. Wenn er allerdings die Seite ohne diesen zusätzlichen Request wegen abgeschaltetem Js (in einer Firma eher unwahrscheinlich), Fehler des Browsers ( ih sag nur IE ;-)) oder eines abstürzendem Betriebsystems verläßt, bleibt der Lock zwar vorübergehend in der Tabelle, kann aber leicht per Cron Jaob, oder bei jedem Start des php Scriptes, über den timestamp, gelöscht werden.
Wenn du willst kanst du auf diese Weise auch verschieden Arten eines Locks implementieren, wie etwa, während einer Aenderung darf niemand den Artikel aendern, oder der Artikel wird zwar geändert. darf aber geöfnet werden, aber nur unter einem anderen Namen gespeichert werden usw.
Ich hoffe ich konnte dir weiterhelfen.
mfg Andres Freund