Меню

Тонкие моменты обновления базы данных в ABAP

|

В статье изложены общие сведения о транзакционности в языке ABAP, а также рассмотрены некоторые проблемы, связанные с обновлением БД и являющиеся «подводными камнями».

>

Тонкие моменты обновления базы данных в ABAP

Мартынов Павел, руководитель направления ABAP/Портал. Место работы: ООО «М.видео Менеджмент». Профессиональный опыт: Почти 7 лет занимается разработкой приложений на ABAP. В данный момент занимает должность руководителя направления ABAP/Портал в компании «М. видео».Основная задача управление внутренними разработками, анализ и согласование разработок в рамках проектов внедряемых в компании.

 

В статье изложены общие сведения о транзакционности в языке ABAP, а также рассмотрены некоторые проблемы, связанные с обновлением БД и являющиеся «подводными камнями».

Немного теории

Транза́кция (англ. transaction) — в информатике, группа последовательных операций, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, с соблюдением целостности данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще, в каковом случае она не должна произвести никакого эффекта. (Данное определение взято в Википедии) Транзакционность в системе SAP поддерживается на двух уровнях; на уровне СУБД и на уровне сервера приложений:

  • На уровне СУБД транзакционность поддерживается путем открытия ЛЕР (логических единиц работы, английский вариант LUW Logical Unit of Work). В начале выполнения программы при обращении к базе данных открывается ЛЕР на уровне базы данных, далее при работе программы, если происходит явный или не явный COMMIT, то текущий ЛЕР закрывается, все данные сохраняются в БД и открывается новый ЛЕР.
  • На уровне сервера приложений для обеспечения транзакционности используются «модули обновления» ( такие как CALL FUNCTION IN UPDATE TASK, PERFORM ON COMMIT), данные модули при вызове регистрируются в системе, но не выполняются сразу. Система собирает очередь обновления, после того, как в программе появляется явный оператор завершения транзакции (COMMIT WORK), система начинает выполнять последовательно зарегистрированные процессы обновления. Если в программе выполняется явный оператор отката транзакции (ROLLBACK WORK), то система удаляет вызовы из очереди обновления и откатывает текущий ЛЕР на уровне БД.  

Обновление БД в языке ABAP делятся на прямые (direct update) и в модулях обновления:
 

  • Прямые обновления - обновление БД путем вызова операторов UPDATE, DELETE или MODIFY явно в программе на ABAP. В этом случае, данные операторы сразу выполняются в СУБД и попадают в текущую открытую ЛЕР БД.
  • Обновления в модулях обновления – обновление БД путем вызова операторов UPDATE, DELETE или MODIFY в модуле обновления.

Проблемы неявных COMMIT’ов

При обработке программы на сервере приложений системы часто происходит закрытие текущей ЛЕР БД и открытие новой ЛЕР БД в рамках одной программы (неявные COMMIT’ы). Данная ситуация постоянно происходит при обработке экранов. На Рис.1 из справки по обновлению системы видно, что при каждой обработке событий PAI на экране происходит неявный COMMIT, после чего текущий ЛЕР БД закрывается и открывается новый, и все прямые обновления сделанные в БД больше откатить нельзя. На первый взгляд, что в этом такого, но давайте рассмотрим пример.

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти