[gelöst] Problem Multiuserzugriff

8. Oktober 2008 15:22

Hallo zusammen,

ich habe folgendes Problem:
wir haben die Logik beim Drucken von Belegen(z.B. bei der Einkaufsbestellung) so erweitert, dass ein PDF davon erzeugt wird und archiviert wird.
Microsoft erzeugt bei diesem Vorgang einen Eintrag im Aktivitätenprotokoll. Wir greifen beim Archiveren nochmal in diesen Datensatz
und updaten einige Felder, bezüglich des Archivierungsvorgangs.

Wenn nun mehrere Benutzer gleichzeitig drucken, kommt sehr häufig folgende Fehlermeldungen:
-----------------------------------------------------------------------------------------------------------------------------------------------
Ihre Aktivität wurde durch die Änderung der Tabelle Aktivitätenprotokollposten durch einen anderen Anwender blockiert.
Bitte beginnen Sie die Aktivität noch einmal
---------------------------------------------------------------------------------------------------------------------------------------------
wird in CU 5051 SegManagement in Funktion "LogInteraction" geworfen. Reiner MS Code. Hier wird der Posten erzeugt.
An dieser Stelle haben wir nichts geändert


--------------------------------------------------------------------------------------------------------------------------------------------------
Die Aktivitätenprotokollposten-Tabelle kann nicht geändert werden, weil sie von einem anderen Benutzer gesperrt ist.
Warten Sie, bis der Benutzer seine Arbeit abgeschlossen hat, und versuchen Sie es dann erneut.
------------------------------------------------------------------------------------------------------------------------------------------------
wird an der Stelle geworfen, wenn wir das Update der Daten vornehmen


Ich habe nun schon alle möglichen Sachen probiert: LOCKTABLE in MS Code entfernen, LOCKTABLE nur vor INSERT setzen,
LOCKTABLE auch in unseren Code aufnehmen. Es hat alles nichts funktioniert.

Deswegen wäre mir folgendes eingefallen:
Bei einem kritischen UPDATE oder INSERT wird abgefragt, ob es geklappt hat (Rückgabewert) und wenn nicht
eine Schleife mit SLEEP Befehl gestartet, solange bis die Tabelle wieder frei ist.
Code:
  geklappt := InteractLogEntry.MODIFY;
  IF (geklappt = FALSE) THEN BEGIN
    REPEAT
      SLEEP(25);
      b := b + 1;
    UNTIL (InteractLogEntry.MODIFY = TRUE) OR (b >= 25);
  END;


Im Debugger bekommt die Variable geklappt noch FALSE, dann wird aber sofort wieder mit dem Fehler abgebrochen


Weiß irgendjemand einen Lösungsansatz.
Ich habe auch schon mal eine Beitrag hier verfolgt, wo es um Multiuserfähigkeit geht,
doch einen Eingriff in die Schlüssel sammt den SIFT Eingenschaften, würde ich nur ungern machen
Zuletzt geändert von Gollum83 am 27. Oktober 2008 09:14, insgesamt 1-mal geändert.

Re: Problem Multiuserzugriff

24. Oktober 2008 08:27

Hallo,

ich kenne mich leider nicht sehr gut in diesem Bereich von NAV aus, möchte aber einen Ansatz für die Lösung geben:

Wie Lange dauert die Transaktion, die zum Einfügen bzw. Ändern der Aktivitätenprotokollposten führt?

Sollte der komplette Ausdruck und Archivierung in einer Transaktion ablaufen, kann es natürlich sein, das die Tabelle länger gesperrt bleibt als nötig. Daher versuche die Schreibtransaktion in die Aktivitätenprotokollposten so kurz wie möglich zu halten.

Gruß, Fiddi

Re: Problem Multiuserzugriff

24. Oktober 2008 08:43

Hallo Fiddi,

Vielen Dank für den Hinweis.
Am Anfang hat der ganze Druckvorgang mit Archivierung bis zu 2 Minuten gedauert. Die Zeit für die Änderung in den Aktivitätenprotokollposten dürfte dabei aber
eher kurz gewesen sein. Da ist der Fehler ganz oft passiert.
Wir konnten den PDF Erzeugungsvorgang nun erhebllich verkürzen, der ganze Vorgang dauert nun nur mehr einige Sekunden. Und tatsächlich tritt der Fehler kaum mehr auf.
Sicher, die Wahrscheinlichkeit, dass 2 User innerhalb von ein paar Sekunden Drucken, ist dann doch geringer.

Jedoch bin ich da schon von der MS Technik entäuscht. Obwohl wir bei den Zugriffen an die MS Vorgehensweise gehalten haben, gibt es keine Möglichkeit,
den Multiuserzugriff sinnvoll zu regeln. Es läuft halt so: meistens gehts und ab und zu Pech gehabt. Wenn der Fehler auftritt und irgendwo davor von Microsoft
ein COMMIT gesetzt wurde, kanns ja durchaus zu ungewünschten Ergebnissen kommen.

Gruß
Gollum

Re: Problem Multiuserzugriff

24. Oktober 2008 08:50

Hallo,

ein paar Sekunden sind beim Multiuser- Zugriff Ewigkeiten.
Versuche die Daten für die Änderung der Tabelle vorher zu sammeln, und mit einer neuen Transaktion die Tabelle zu ändern.

Gruß, Fiddi

Re: Problem Multiuserzugriff

24. Oktober 2008 10:25

Du hast Recht.
Es wird wahrscheinlich nichts anderes übrig bleiben.
In dem Fall ist halt blöd, weil wir nach der Archivierung in den bereits vorhandenen Posten schreiben wollen,
ob die Archvierung geklappt hat oder nicht. An der Stelle, wo Microsoft den Datensatz einfügt, weiß ich das ja noh nicht

Gruß
Gollum

Re: Problem Multiuserzugriff

24. Oktober 2008 19:03

Versuche die Daten für die Änderung der Tabelle vorher zu sammeln, und mit einer neuen Transaktion die Tabelle zu ändern.


Die Idee hierhinter ist, das ganze in einer Temp. Tabelle zu puffern und am Ende der "Haupttransaktion" alles in die rechte Tabelle zu dumpen.

Re: Problem Multiuserzugriff

27. Oktober 2008 09:13

klingt vernünftig. Sicher, damit gibt es nur noch einen Tabellenzugriff.
In diesem Fall müsste man halt schon stark in die MS Logik eingreifen, aber wenns gar nicht anders geht,
ist das bestimmt die beste Lösung.

Vielen Dank für den Hinweis

Gruß
Gollum