Semaphoren
horst
- datenbank
0 Christian Kruse0 horst0 Christian Kruse0 horst
0 Lude0 Christian Kruse0 Lude
0 horst
Hallo,
ich habe ein Problem mit Semaphoren. Wir sollen eine Datenbank erstellen (Oracle-SQL) und diese Mehrbenutzerfähig mittels Semaphoren machen --> es darf kein Datensatz gelöscht werden, der sich gerade angeschaut wird. Als Tipp hat uns der Dozent gesagt, der Datentyp des Semaphors ist ein INT. Wie aber kann ich herausfinden ob ein User sich den Datensatz nicht mehr anschaut? (Die Oberfläche wird evt in Java realisiert) Bzw wie fange ich Systemabstürtze etc ab? Hat einer von Euch eine Idee wie man das mit einem INT in einer extra Spalte lösen kann? Geht das überhaupt (ich glaube ja nicht)?
Ich würde es mittels TIMESTAMP lösen, da weiss ich zwar nicht wieviele sich den Datensatz gerade anschauen, weiss aber wann der neuste Nutzer angefangen hat, sich das Tupel anzuschauen und könnte so nach zwei Minuten (oder so) das Semaphor wieder runterzählen...
Viele Grüße
Horst
Hallo horst,
ich habe ein Problem mit Semaphoren. Wir sollen eine
Datenbank erstellen (Oracle-SQL) und diese
Mehrbenutzerfähig mittels Semaphoren machen --> es darf
kein Datensatz gelöscht werden, der sich gerade angeschaut
wird. Als Tipp hat uns der Dozent gesagt, der Datentyp des
Semaphors ist ein INT. Wie aber kann ich herausfinden ob
ein User sich den Datensatz nicht mehr anschaut? (Die
Oberfläche wird evt in Java realisiert) Bzw wie fange ich
Systemabstürtze etc ab? Hat einer von Euch eine Idee wie
man das mit einem INT in einer extra Spalte lösen kann?
Geht das überhaupt (ich glaube ja nicht)?
Prinzipiell koennte man das machen, indem man in einer Spalte
eine Integer-Zahl mitfuehrt, die man ueber eine Sequence
eindeutig haelt. Diese Integer-Zahl koennte dann der
Identifier fuer den Semaphore werden. Wenn sich jetzt jemand
den Datensatz anschaut, erzeugst du einen Semaphore, dessen
Identifier die Nummer des Datensatzes ist. Soll der Datensatz
jetzt geloescht werden, schaust du, ob der Semaphor existiert
oder nicht. Betrachtet der User den Datensatz nicht mehr,
zerstoerst du den Semaphor wieder. Du musst allerdings
aufpassen, du duerftest relativ zuegig an Systemgrenzen
stossen (man kann nicht unbegrenzt Semaphoren anlegen).
Deshalb ist es auch wichtig, den Semaphore in jedem Fall
wieder zu zerstoeren. Ich an deiner Stelle wuerde ausserdem
noch dafuer sorgen, dass die Semaphoren nach einem bestimmten
Alter (z. B. einer halben Stunde) automatisch wieder
zerstoert werden, um Deadlocks zu vermeiden.
Gruesse,
CK
Hallo horst,
ich habe ein Problem mit Semaphoren. Wir sollen eine
Datenbank erstellen (Oracle-SQL) und diese
Mehrbenutzerfähig mittels Semaphoren machen --> es darf
kein Datensatz gelöscht werden, der sich gerade angeschaut
wird. Als Tipp hat uns der Dozent gesagt, der Datentyp des
Semaphors ist ein INT. Wie aber kann ich herausfinden ob
ein User sich den Datensatz nicht mehr anschaut? (Die
Oberfläche wird evt in Java realisiert) Bzw wie fange ich
Systemabstürtze etc ab? Hat einer von Euch eine Idee wie
man das mit einem INT in einer extra Spalte lösen kann?
Geht das überhaupt (ich glaube ja nicht)?Prinzipiell koennte man das machen, indem man in einer Spalte
eine Integer-Zahl mitfuehrt, die man ueber eine Sequence
eindeutig haelt. Diese Integer-Zahl koennte dann der
Identifier fuer den Semaphore werden. Wenn sich jetzt jemand
den Datensatz anschaut, erzeugst du einen Semaphore, dessen
Identifier die Nummer des Datensatzes ist. Soll der Datensatz
jetzt geloescht werden, schaust du, ob der Semaphor existiert
oder nicht. Betrachtet der User den Datensatz nicht mehr,
zerstoerst du den Semaphor wieder. Du musst allerdings
aufpassen, du duerftest relativ zuegig an Systemgrenzen
stossen (man kann nicht unbegrenzt Semaphoren anlegen).
Deshalb ist es auch wichtig, den Semaphore in jedem Fall
wieder zu zerstoeren. Ich an deiner Stelle wuerde ausserdem
noch dafuer sorgen, dass die Semaphoren nach einem bestimmten
Alter (z. B. einer halben Stunde) automatisch wieder
zerstoert werden, um Deadlocks zu vermeiden.
das war ja genau meine Frage: woher weiss ich, wann ein Semaphor gesetzt wurde? oder meinst Du ich sollte die Zeit mit dem Identifier in eine Tabelle eintragen??
erstmal danke für deine hilfe!
gruss
horst
Hallo horst,
das war ja genau meine Frage: woher weiss ich, wann ein
Semaphor gesetzt wurde? oder meinst Du ich sollte die Zeit
mit dem Identifier in eine Tabelle eintragen??
Zu Semaphoren kann man Werte speichern...
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
u_short *array; /* array for GETALL & SETALL */
};
Manuals lesen hilft ungemein.
Gruesse,
CK
Hallo CK,
Zu Semaphoren kann man Werte speichern...
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
u_short *array; /* array for GETALL & SETALL */
};
also kann ich es nicht über eine INT-Spalte in der jeweiligen Tabelle lösen?
Da ich ja nicht weiss wo ich lesen soll, hilft ein rtfm nicht, sorry :(
Könntest Du mir das oben noch erklären oder mit bitte einen Link schicken? Für Hilfe wäre ich sehr dankbar
Gruß
Horst
Hi,
das Problem ist nicht in einer Umgebung mit einem verbindungslosen Protokoll zu lösen. Ist das nicht der Fall, sollte die Information "Datensatz ausgecheckt" in irgendeiner Form im ausgecheckten Datensatz gespeichert werden. Ich denke eine Benutzer-GUID wäre OK.
Die Clientanwendung müsste Ihren "Lease" von Zeit zu Zeit erneuern.
Gruss,
Lude
Hallo Lude,
das Problem ist nicht in einer Umgebung mit einem
verbindungslosen Protokoll zu lösen. Ist das nicht der Fall,
sollte die Information "Datensatz ausgecheckt" in
irgendeiner Form im ausgecheckten Datensatz gespeichert
werden. Ich denke eine Benutzer-GUID wäre OK.
Sehe ich anders. Dafuer sind Semaphoren da. Und bei
System-V-Semaphoren (ich bin stillschweigend davon
ausgegangen) kann man durchaus Werte bei den Semaphoren
speichern, z. B. eine UID oder einen Timestamp. Da ist eine
Modifikation der Daten gar nicht notwendig.
Gruesse,
CK
Hi CK,
Sehe ich anders. Dafuer sind Semaphoren da. Und bei
System-V-Semaphoren (ich bin stillschweigend davon
ausgegangen) kann man durchaus Werte bei den Semaphoren
speichern, z. B. eine UID oder einen Timestamp. Da ist eine
Modifikation der Daten gar nicht notwendig.
ich kenne Semaphoren nicht als explizit vom DB(M)S unterstützte Objekte. Allerdings scheint mir Dein Semaphore-"Create" (Oracle-Syntax?) nicht ganz mit der "Datentyp-INT"-Aussage des Threadeigentümers zusammenzupassen.
M.E. löst man solche Anforderungen "zu Fuss", also über ein der betreffenden Tabelle hinzugefügtes DF und entsprechender Änderung des Datenzugriffs (idealerweise Änderung an nur zwei bis drei gespeicherten Prozeduren).
Gruss,
Lude
Hallo Lude,
Die Clientanwendung müsste Ihren "Lease" von Zeit zu Zeit erneuern.
Lease??
Wie macht das denn der Client wenn er abstürtzt?
gruss
horst