Использование буферизации при работе с диапазонами номеров

Взбодрим серое вещество очередным погружением в технические глубины излюбленной всеми системы. Тема урока - использование буферизации при работе с диапазонами номеров.

Работая с диапазонами номеров в системе SAP, уверен, мало кто обращал внимание на такую опцию, как настройка/активация буферизации.

См. Buffering

А вещица, прямо скажем, весьма занятная. Вендор предоставляет три опции работы с буферизацией:

  • No buffering (Нет буферизации)
  • Main Memory Buffering (Буферизация оперативной памяти)
  • Parallel Buffering (Параллельная буферизация)

Далее немного информации по каждому из пунктов.

Исходные данные

С помощью транзакции SNUM я создам диапазон номеров вида

Рисунок 1.

Сам диапазон будет иметь следующий вид

Рисунок 2.

No buffering

Активация данного типа буферизации, а точнее его деактивация, производится на закладке Customizing самого диапазона

Рисунок 3.

Активировав данную настройку, создается запись в таблице NRIV, где определяется последний "выданный" номер для диапазона. Использование такого типа буферизации блокирует таблицу NRIV до тех пор, пока не будет выдан следующий свободный номер.

Рисунок 4.

Cм. Buffering

To understand the consequences of an unbuffered number assignment, you have to examine the process in detail:

The structure of the intervals of a number range object is defined in database table NRIV. If a number is taken from an interval, the table line for it must be locked. This lock remains until the application that requested the number is closed, either with a COMMIT WORK or a ROLLBACK. Only then is it specified that the requested number actually has been used or that the process was cancelled. In the latter case the number remains available as before. By locking the table line in NRIV, a chronological number assignment with no gaps can be guaranteed. During the lock period no other numbers can be taken from the interval, which means that a lot of number requests may be collecting that have to be processed one after the other. This can lead to performance problems (see also 678501 Information published on SAP site).

На следующем видеофрагменте представлена следующая последовательность действий:

  1. Для вновь определенного диапазона номеров, я запускаю ABAP программу с помощью которой, через вызов ФМ NUMBER_GET_NEXT, обращаюсь к диапазону для получения следующего свободного номера;
  2. Выполнив первый запуск программы, и получив номер 100 из диапазона, я параллельно запускаю эту же программу;
  3. На шаге вызова ФМ NUMBER_GET_NEXT программа "зависает" до тех пор, пока не будет закончено выполнение предыдущего сеанса;
  4. После окончания предыдущего сеанса, я продолжаю работу "зависшей" программы и получаю следующий свободный номер из диапазона - 101. И т.д.;
  5. Последнее выданное число для диапазона записано в таблице NRVIV

Main Memory Buffering

Активация этого типа буферизации, также выполняется на закладке Customizing

Рисунок 5.

Используя такой тип буферизации, при попытке обращения к диапазону номеров, будет выдан пул значений, в пределах которого может быть "зарезервирован" очередной номер. Размер пула выдаваемых номеров определяется настройкой, указанной вами в самом диапазоне (см. No. of Numbers in Buffer). Таблица NRIV не блокируется при обращении к диапазону. В один момент времени к диапазону может быть выполнено несколько обращений.

В зависимости от момента времени, и условий запуска (например, наличие нескольких инстанций сервера приложений, для которых определяется собственный буфер для пула выдаваемых номеров) когда было выполнено обращение к диапазону с такой настройкой буферизации, какая-то часть номеров может быть потеряна. То есть могут образоваться пробелы. Сами же выдаваемые диапазоны хранятся в основной памяти.

См. Main Memory Buffering

How Main Memory Buffering Works
When a number is requested for the first time from a specific interval after the application server instance is started, instead of these single numbers, a whole package of numbers is immediately loaded from this interval into the main memory. The number of numbers in this package corresponds to the number that was specified as the number of numbers in the buffer on the Customizing tab of transaction SNUM at the time when the number range object was defined. The numbers used, which is defined in table NRIV for this interval, increases by the corresponding number. With this process the line of table NRIV is not locked. Applications that later request numbers from this interval are assigned numbers directly from the associated main memory buffer until the supply of numbers is used up. They do not access table NRIV. If the application server instance is to be started before all numbers in the main memory buffer are used, these numbers are lost from the whole number supply. This results in gaps in the number assignment.

In many cases multiple instances of the application server are running in parallel. If so, each instance is provided with its own number buffer for this interval. Depending on which instance the application is running in, the numbers are pulled from one or the other buffer and can no longer be sorted chronologically.

На следующем видеофрагменте представлена следующая последовательность действий:

  1. Для вновь определенного диапазона номеров, я запускаю ABAP программу с помощью которой, через вызов ФМ NUMBER_GET_NEXT, обращаясь к диапазону, пытаюсь получить следующий свободный номер;
  2. Выполнив первый запуск программы, я получаю первый свободный номер 100;
  3. После выполнения первого обращения к диапазону номеров, формируется пул выдаваемых номеров в количестве трех (с 100 по 102). В таблицу NRIV записывается максимальное значение диапазона (102);
  4. По мере параллельного запуска программы обращения к этому же диапазону номеров, происходит резервирование и использование следующего свободного номера из пула выданных номеров (101) и т.д.;
  5. По мере исчерпания всего пула выданных номеров (последнее значение из диапазона 102), происходит повторная генерация пула номеров (с номера 103 по 105). Максимальное значение из пула (105) записывается в таблицу NRIV

N.B. Посмотреть актуальный статус буфера диапазона номеров возможно в транзакции SM56.

См. Administration of the Number Range Buffer

Рисунок 6.

Parallel Buffering

Активация этого типа буферизации, по-прежнему выполняется на закладке Customizing

Рисунок 7.

Данный тип буферизации практически идентичен типу Main Memory Buffering, представленному выше, за исключением того, что выдаваемый диапазон сохраняется не в памяти, а в таблице NRIVSHADOW.

Ценным преимуществом использования этого типа буферизации является возможность возврата зарезервированного номера из пула выданных номеров обратно в буфер, например, в случае непредвиденного прекращения работы приложения. Таким образом, данный номер может быть повторно использован при следующем вызове приложения (пробелы в нумерации в таком случае исключены). Больше информации по этому типу буферизации можно найти в справочном материале вендора, ссылка на который предоставлена выше.

Рисунок 8.

См. Parallel Buffering

How Parallel Buffering Works

In principle, parallel buffering works in the same way as main memory buffering, with the difference that the number packages are not stored in the main memory, but are written to the table NRIVSHADOW. In the case of a termination by the application (a ROLLBACK), the number is written back to the buffer and can be used again later, so no numbers are lost from the set in this way. This is also the case if there is a system restart.

For more information, see SAP Note 599157 Information published on SAP site.

На следующем видеофрагменте представлена следующая последовательность действий:

  1. Для вновь определенного диапазона номеров я запускаю ABAP программу с помощью которой, через вызов ФМ NUMBER_GET_NEXT, обращаюсь к диапазону для получения свободного номера;
  2. После первичного запуска программы резервируется первый свободный номер 100;
  3. В таблице NRIVSHADOW создается запись с определением диапазона;
  4. Повторно выполняя вызов ФМ NUMBER_GET_NEXT и достигая предела выданных номеров в пуле (с 100 по 102), создается новая запись (с 103 по 105). И т.д.

Read more