Announcement

Collapse
No announcement yet.

Einzelnes Record in Table 'sperren'

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

  • Einzelnes Record in Table 'sperren'

    Hi *,<br>
    Verständnisfrage:<br>
    Wie gehe ich im Allgemeinen am besten vor, wenn ich in einer IB Tabelle ein einzelnes Record sperren will ? Wenn z.B. zwei User gleichzeitig ein Record geöffnet haben, der eine zuerst ändert und dann der zweite das schon geänderte ändern will bekomme ich ja Probleme. Ich dachte das geöffnete Record zu sperren. Wie macht man das am besten oder denke ich da grundsätzlich falsch ?

    Vielen Dank R.

  • #2
    Hallo,

    &gt;..oder denke ich da grundsätzlich falsch ?

    in der Tat sind die pessimistischen Sperren bei SQL-Datenbanken unüblich. Bei einer datensatzorientierten Desktop-Datensatz war die pessimistische Sperre <b>Pflicht</b>, da verschiedene Clients über ihre Rechner direkt auf die gemeinsam genutzte Datei zugreifen müssen. Daher übernimmt die pessimistische Sperre die Rolle des "Schiedsrichters".

    Bei einer mengenorientierten SQL-Datenbank kann kein Client direkt auf die Datenbankdatei zugreifen, alle Zugriffe laufen über SQL, so dass der SQL-Server die Rolle des Schiedsrichters übernimmt und somit die pessimistische Sperre für die Funktion nicht benötigt wird.

    Damit mehrere Benutzer ihre Änderungen nicht gegenseitig überschreiben können, gibt es verschiedene Wege: <br>
    a) Alle Spaltenwerte beim UPDATE mit in das WHERE-Kriterium aufnehmen <br>
    b) Multigenerationen-Architektur des InterBase ausnutzen <br>
    c) Pessimistische Sperre simulieren, indem sofort ein Dummy-Update auf den Datensatz gemacht wird und die Transaktion solange offen gehalten wird, bis der Benutzer seine Eingabe speichert.

    Der Fall c) hat jedoch im gravierende Nebenwirkungen für den Multiuser-Betrieb (da exklusive Sperren für längere Zeit aktiv bleiben)

    Comment


    • #3
      Hallo,
      bei uns wird das ein wenig anders gehandhabt.

      Wir haben eine Lock-Tabelle, in die dann die eindeutigen Schlüsselwerte und die Tabelle eingetragen werden. Jedesmal, wenn ein Benutzer auf einen Datensatz zugreifen will, wird geprüft, ob dieser Datensatz in der Lock-Tabelle steht und gibt ggf. eine MessageBox mit "Dieser Datensatz wird gerade von Benutzer xy benutzt. Wollen Sie erneut versuchen, die Sperre zu setzen? Ansonsten können Sie nur lesend zugreifen. Ja - Nein"

      So verhindern wir Kollisionen, denn der User sieht, wer gerade lockt und kann sich mit diesem User telefonisch (zwecks Absprache) in Verbindung setzen. Natürlich hängt da auch ein größerer Apparat dran, der bei Abstürzen Locks löscht usw.
      Aber bei unseren 120 Usern funktionierte das (gut durchdacht) auf Anhieb problemlos

      Comment

      Working...
      X