Show TOC

HintergrundFunktionsweise des Nummernkreispuffers Dieses Dokument in der Navigationsstruktur finden

 

Der Nummernkreispuffer ist Teil des SAP-Kernels. Er legt auf jedem Applikationsserver einen Speicherbereich an, auf den alle Workprozesse zugreifen können (Shared Memory).

Voraussetzungen

Das System versucht, eine Nummer aus dem Puffer zu ziehen, wenn folgende Bedingungen erfüllt sind:

  • Mit dem Funktionsbaustein NUMBER_GET_NEXT soll eine Nummer zu einem Objekt gezogen werden

  • Der Parameter IGNORE_BUFFER des Funktionsbausteins ist nicht gesetzt

  • Für das Nummernkreisobjekt ist die Hauptspeicherpufferung aktiviert

Prozess

Dazu geht der Nummerkreispuffer wie folgt vor.

Er prüft, ob er für das gewünschte Nummernkreisintervall bereits einen Bereich im Puffer hat und ob dieser Bereich noch nicht erschöpft ist. Wenn ja, wird der Nummernstand im Puffer um die gewünschte Anzahl Nummern erhöht und die gezogenen Nummern an den Aufrufer gegeben. Anschließend kann sofort ein anderer Prozess eine Nummer aus dem selben Intervall ziehen. Allerdings werden die Nummern bei einem Rollback nicht mehr in den Puffer zurück gestellt sondern sind "verloren".

Achtung Achtung

Im Falle eines Rollback erzeugt dies ein Lücke bei den Belegnummern. Anwendungen, die dies nicht wünschen (oder aus rechtlichen Gründen nicht dürfen), können den Nummernkreispuffer nicht benutzen.

Ende der Warnung.

Wenn das gewünschte Nummernkreisintervall noch nicht im Puffer ist oder der Nummernvorrat dort erschöpft ist, muss der Nummernkreispuffer neue Nummern von der Tabelle NRIV auf der Datenbank holen. Der verwendete Mechanismus wird Nummernkreisserver genannt. Aus technischen Gründen wird hierzu ein zweiter Workprozess (WP2) benötigt. Dieser läuft normalerweise auf dem selben Server wie der Prozess, der gerade eine Nummer ziehen möchte (WP1).

Hinweis Hinweis

Mithilfe des Profilparameters nobuf/server können Sie hierfür aber auch einen anderen Server bestimmen.

Ende des Hinweises

WP1 beauftragt diesen zweiten Prozess (WP2) auf der Datenbank aus der Tabelle NRIV so viele Nummern zu ziehen wie in der Nummernkreisobjektpflege (SNRO) unter Anzahl Nummern im Puffer konfiguriert ist. Während dieser Zeitspanne hat WP1 den Zustand hält in der Workprozessübersicht (SM50) mit Haltegrund NUM. Bei WP2 ist unter Detailinfo zu sehen, für welches Nummernkreisintervall er gerade Nummern auf der Datenbank ziehen will.

Bevor WP2 Nummern an WP1 zurück gibt, werden die gezogenen Nummern sofort auf der Datenbank festgeschrieben (COMMIT). Dies hat den Nachteil, dass bei einem Herunterfahren des Servers alle nun gepufferten Nummern aus dem Intervall "verloren" sind. Dies kann zu großen Lücken im vergebenen Bereich der vergebenen Belegnummern führen (in der Größenordnung der Anzahl Nummern im Puffer, für jeden aktiven Server).

Folgende Grafik zeigt den Ablauf und die beteiligten Komponenten.

Die Abbildung wird im Begleittext erläutert.

Nummer ziehen — Ablauf

Schutz vor konkurrierendem Zugriff

Wie alle Speicherbereiche, auf die von mehreren Prozessen aus zugegriffen werden kann, muss der gleichzeitige Zugriff mehrere Prozesse verhindert werden. Hierzu gibt es einen zweistufigen Mechanismus:

  • Wenn zu einem Eintrag im Puffer ein Nummer gezogen werden soll, wird dieser Eintrag durch eine interne Sperre gesperrt. Diese Sperre sorgt dafür, dass immer nur ein Benutzer gleichzeitig eine Nummer ziehen kann. Die Sperre wird sofort wieder freigegeben, wenn die Nummer gezogen wurde. Üblicherweise dauert das Ziehen einer Nummer nicht länger als 50 Mikrosekunden.

    Diese Sperre wird allerdings auch gehalten, wenn die Nummern zu diesem Eintrag erschöpft sind und über den Nummernkreisserver neue Nummern auf der Datenbank zu ziehen. Während der gesamten Datenbankaktivität bleibt dieses Sperre bestehen. Wenn die Sperre gesetzt ist, kann man dies in der Transaktion SM56 in der Übersicht der Puffereinträge erkennen.

  • Wenn Einträge im Puffer hinzugefügt oder gelöscht werden, wird eine globale Semaphore gesetzt (Semaphore 8). Wenn diese Semaphore in der Prozessübersicht längere Zeit (>1 Minute) gesperrt ist, liegt ein Problem mit dem Puffer vor. Hier ist ein kompletter Stillstand des betroffenen Servers oder sogar des ganzen Systems nicht ausgeschlossen.

Ist der Nummernkreispuffer so konfiguriert, dass er nur eine Nummer enthält, ist das Verfahren etwas anders. Informationen dazu finden Sie unter Eine Nummer im Puffer.

Beispiel Beispiel

In diesem Beispiel ist der Puffer leer (Stand ist gleich Puffer-Bis-Nr.), der Puffer muss also über den Nummernkreisserver gefüllt werden.

Beim Zugriff auf den Nummernkreisserver erscheint in der Transaktion SM56 (Administration des Nummernkreispuffers) für sehr kurze Zeit der rote Eintrag. Der Nummernkreispuffer kann keine Nummer an einen Workprozess verteilen, weil ein anderer Prozess gerade auf den Nummernkreisserver zugreift.

Ende des Beispiels.