Announcement

Collapse
No announcement yet.

Anzeige der Bearbeitung eines Datensatzes durch anderen Nutzer

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

  • Anzeige der Bearbeitung eines Datensatzes durch anderen Nutzer

    Hallo!

    <b>Wie kann ich mit Delphi und IBX feststellen, ob ein Datensatz aktuell bearbeitet wird?</b>

    Ich verwende nur IBDataset, kein IBTable.
    Ich möchte <b>nicht</b>, daß die ganze Tabelle durch die Transaction gesperrt wird.
    Ich verwende "read_commited","rec_version","nowait".
    Der Nutzer, der den Datensatz später editieren will, darf auch nicht ausgebremst werden, deshalb "nowait".

    Nun möchte ich aber eine Fehlermeldung ausgegeben haben, die sagt: "Da editiert schon jemand den Datensatz".
    Ich habe das versucht durch eine try...except Block zu ermöglichen, in dem ich erst ein DataSet.edit, dann ein DataSet.Post (mit commit) und dann wieder ein DataSet.Edit ausführe, so daß ein eventueller Konflikt beim ausführen des Post auftreten müsste und dass zu einem Abbruch vor dem 2. Edit führen soll.

    Aber da passiert nichts.-> keine Exception.

    <b>Wie kann ich das nun bewerkstelligen?</b>

  • #2
    Hallo,

    die Umsetzung einer pessimistischen Datensatzsperre für eine InterBase-Tabelle beschreibe ich in meinem Buch <i>InterBase Datenbankentwicklung mit Delphi</i> auf den Seiten 352 bis 354. Das Beispielprojekt ist auf der CDROM zu Buch.

    Das Prinzip ist das folgende: <br>
    1. Unmittelbar vor dem Editieren eine Transaktion starten <br>
    2. Nach dem Einlesen sofort Edit, Post, Edit auslösen, wobei die Transaktion <b>nicht</b> beendet wird. <br>
    3. Datensatz in Ruhe bearbeiten, bei einem anderen Benutzer schlägt nun der Schritt 2 in jedem Fall fehl.<br>
    4. Am Ende nochmals Post und danach Commit aufrufen - der InterBase entfernt die Sperre, so dass dieser Datensatz wieder von anderen Benutzern bearbeitet werden kann.

    Das Ganze funktioniert nur dann, wenn <i>read_commited</i>, <i><b>no_rec_version</b></i> und <i>nowait</i> zusammen verwendet wird.
    &#10

    Comment


    • #3
      ich hoffe die Frage wird noch gesehen.

      Hallo Herr Kosch,

      ich habe die pessimistischen Datensatzsperre in mein Project eingebaut,
      funktioniert auch wunderbar. Doch dann kommen die lieben User.
      Frage: Gibt es in Interbase eine Möglichkeit, den Usernamen der
      aktuellen Transaktion zu erfahren, oder muß ich den Usernamen vom Client aus mitgeben ?

      PS: Update und Insert erfolgen über eine Stored Procedure auf dem Server.

      mit freundlichem Gruß
      Mari

      Comment


      • #4
        Hallo,

        in diesem Fall würde ich die pessimistische Sperre nicht über die offene InterBase-Transaktion implementieren, sondern statt dessen eine zusätzliche Hilfstabelle führen, in der jeder Primärschlüsselwert des zu "sperrenden" Datensatzes zusammen mit dem jeweiligen Benutzernamen eingetragen wird. Bevor ein Datensatz zur Bearbeitung geöffnet wird, schaut das Programm vorher in dieser Hilfstabelle nach, ob der Primärschlüsselwert dort vorgefunden wird. Wenn ja, ist der Datensatz "gesperrt", so dass der dort vorgefundene Benutzername angezeigt werden kann. Erst dann, wenn der erste Anwender seine Bearbeitung abschließt, wird der Eintrag aus dieser Hilfstabelle (Reservierungstabelle) wieder entfernt.

        Der Haken an der Sache liegt in der Frage, wie man mit "Leichen" in dieser Reservierungstabelle umgeht :-

        Comment


        • #5
          Hallo,

          also kann man auf dem Server nicht den Namen des Users ermitteln, welcher die aktuelle Transaktion gestartet hat.

          richtig ?!

          Gruß Mari

          Comment


          • #6
            Hallo,

            meines Wissens nach steht diese Option beim InterBase 5.x bzw. 6.x nicht zur Verfügung. Erst der InterBase 7 ist an dieser Stelle gesprächiger, da es dort die neue temporäre Tabellen <i>TMP$TRANSACTIONS</i> und <i>TMP$ATTACHMENTS</i> gibt. Die Abfrage beider Tabellen (JOIN) liefert in der Spalte <b>TMP$ATTACHMENTS.TMP$USER</b>
            den Benutzernamen zurück

            Comment

            Working...
            X