Announcement

Collapse
No announcement yet.

Lesezugriff exklusiv sperren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Lesezugriff exklusiv sperren

    Hi,
    ich möchte verhindern, dass auf eine Tabelle lesend zugegriffen werden kann. Leider habe ich bisher nur Sperren gefunden die Updates oder Inserts verhindern, aber nicht den Lesezugriff. Weiß jemand, wie man das machen kann?
    Viele Grüße,
    Steffen

  • #2
    Einen 2. Benutzer anlegen und diesem einfach nur Rechte auf die von Dir gewünschten Tabellen geben.

    Comment


    • #3
      Das hilft mir nicht. Ich bin mit dem gleichen Benutzer mit mehreren Sessions verbunden. Es soll der Lesezugriff für die anderen Sessions gesperrt werden, außer für die erste. Die erste Session fügt einen Datensatz dazu und danach dürfen die weiteren Sessions erst Lesen, da der neu eingefügte Datensatz wichtig ist. Das kann auch nicht nacheinander ausgeführt werden, da etliche Threads im Programm laufen und dadurch parallel die selbe Methode im Code aufgerufen wird. Und diese Methode prüft den auf den letzten Insert in dieser Tabelle und legt einen neuen Datensatz an. Das soll aber nicht von allen Threads passieren, sondern nur einmal am Tag. Daher muss eine Sperre erfolgen.

      Comment


      • #4
        Das ist natürlich eine ganz andere Problemstellung als die oben beschriebene und ich kann mir auch vorstellen, dass das mit Datenkbank Bordmitteln schwierig ist.
        Warum kannst Du denn das Problem nicht gleich im Client lösen? Dort wäre das mit Sicherheit viel einfacher zu lösen. Alle anderen Threads warten darauf bis Session die Daten zum Lesen frei gibt. Oder die Session benachrichtigt die anderen Threads, dass sie soeben einen neuen Datensatz eingetragen hat.
        Der Weg über die Datenbank erscheint mir etwas seltsam.

        Comment


        • #5
          Das hilft mir nicht. Ich bin mit dem gleichen Benutzer mit mehreren Sessions verbunden. Es soll der Lesezugriff für die anderen Sessions gesperrt werden, außer für die erste. Die erste Session fügt einen Datensatz dazu und danach dürfen die weiteren Sessions erst Lesen, da der neu eingefügte Datensatz wichtig ist.

          Wird in einer Session Daten geändert, so sehen alle anderen Sessions die veränderten Daten definitiv steht. Dies gilt unabhängig davon, welcher Benutzer zu dieser Session gehört.
          Nur die Session, die die Datenänderung durchführt, kann die veränderten Daten sehen. Die veränderten Daten können die anderen Sessions nur dann lesen, wenn sie festgeschrieben (COMMIT) werden.

          kuemmelchen

          Comment


          • #6
            Weiß jemand, wie man das machen kann?
            Über Datenbankmittel? In Oracle gibt es hierzu keine Möglichkeit lesenden Zugriff über Locks zu verhindern.

            Du müsstest das schon in deiner Anwendung implementieren. Denkbar wäre z.B. eine Locktabelle mit einem Feld:
            Code:
            create table tbllock(id number primary key check(id=1), 
            locktime date)
            Falls eine Session beginnen möchte Sätze einzufügen, insertet Sie einen Satz mit der ID=1 und der Lockzeit (evt. noch weitere Informationen) und comittet die Änderung sofort. Sollte eine zweite Session das gleichzeitig versuchen bekommt Sie auf jeden Fall eine Unique Constraint Verletzung, auf Die Du regieren kannst.
            Sind die Änderungen abgeschlossen wird die TBLLOCK wieder geleert.
            Sessions, die lesend auf die Tabelle zugreifen wollen prüfen vorher ab, ob in der TBLLOCK ein Eintrag vorhanden ist. Falls ja wird der Lesevorgang abgebrochen.

            Allerdings muss ich zugeben, dass ich deine Ausführungen etwas undeutlich waren, und ich nicht sicher bin, ob es nicht eine elegantere Möglichkeit gäbe.

            Dim
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment


            • #7
              Danke, das hilft mir schon weiter. Allein die Aussage, dass ein Lesezugriff nicht gesperrt werden kann, hilft mir schon.
              Den Rest werd ich mir dann im Programm zusammenbauen.
              Vielen Dank an alle

              Comment

              Working...
              X