horst: Semaphoren

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

  1. 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

    1. 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

      1. 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

        1. 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

      2. 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

        1. 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

          1. 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

        2. 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