РАЗРАБОТКА ABAPP1L2

ABAP: блокировки, SAP LUW и Update Task

Как синхронизировать параллельные изменения и отделять регистрацию обновления от фиксации и фактического результата.

Ревизия 1 Применимость к указанным контекстам Частичное покрытие Контекст: CTX-GENERAL документальная опора: недостаточно данных
Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.

ABAP: блокировки, SAP LUW и Update Task#

Параллельные изменения требуют контроля одновременно на уровне бизнес-объекта и на уровне записи в базе. В ABAP SAP LUW может включать несколько database LUW. Enqueue-блокировка может сохраняться между короткими database LUW, а обновление, зарегистрированное через Update Task, выполняется при фиксации SAP LUW. Поэтому «блокировка получена», «обновление зарегистрировано» и «изменение успешно сохранено» являются разными состояниями.

Блокируйте согласованный бизнес-объект#

Lock object в ABAP Dictionary задаёт объект блокировки. При активации генерируются функции установки и снятия блокировки. До изменения прочитайте объект и получите нужную блокировку; при конфликте сообщите, что объект занят, или предложите безопасное перечитывание. Не продолжайте запись на основании устаревших данных.

Согласуйте ключ блокировки с единицей бизнес-изменения. Если разные программы блокируют один документ по разным ключам или в разном порядке, защита становится неполной и может привести к взаимному ожиданию. Блокировку держите только пока она необходима, и завершайте её при штатном исходе, отмене или ошибке в соответствии с транзакционной моделью приложения.

Enqueue-блокировка управляется SAP lock service и отличается от кратковременной database lock. Она позволяет синхронизировать доступ через несколько database LUW, но не заменяет проектирование ключа, прав доступа или проверки инвариантов. Проверьте режим и время жизни блокировки в документации конкретного приложения; поведение обычных транзакций нельзя автоматически приравнивать к RAP locking и draft lifecycle.

Update Task: регистрация и выполнение#

CALL FUNCTION ... IN UPDATE TASK регистрирует update function module и параметры для более позднего выполнения. Сам вызов не исполняет функцию. COMMIT WORK запускает зарегистрированные обновления. ROLLBACK WORK до фиксации отменяет регистрацию текущей SAP LUW.

Обычный COMMIT WORK не ждёт результата асинхронного update process. Поэтому успешное завершение диалоговой программы не всегда означает, что все последующие изменения обновления успешно применены. COMMIT WORK AND WAIT ждёт завершения синхронного обновления высокого приоритета V1 и позволяет программе обработать его результат. Это не делает внешние вызовы, побочные эффекты или отдельные процессы частью одной атомарной транзакции.

Учитывайте ограничения update function module: нельзя выполнять внутри него собственный COMMIT WORK или ROLLBACK WORK, а разрешения пользователя нельзя считать проверенными там автоматически. Проверяйте полномочия и корректность параметров до регистрации обновления, а ошибки и повторную обработку согласуйте с владельцем процесса. Для диагностики асинхронных ошибок используйте предусмотренный мониторинг обновлений; не запускайте повторно запись вслепую.

Контракт транзакции для финансовой операции#

До реализации запишите: объект и ключ блокировки; когда блокировка берётся и снимается; какие проверки выполняются до записи; какие изменения идут в диалоге, а какие через update task; точку COMMIT и смысл ответа пользователю; поведение при конфликте, отмене и ошибке update; способ сверить созданный документ.

После разрыва связи между клиентом и сервером сначала выясните состояние операции по бизнес-ключу или идентификатору корреляции. Повторный запрос без такой проверки способен создать дубликат, если исходная фиксация прошла, а ответ потерялся. Проектируйте идемпотентность и сверку отдельно от enqueue lock: блокировка предотвращает одновременное изменение, но сама по себе не дедуплицирует повторные запросы.

Проверяйте минимум два конкурирующих изменения одного объекта, отказ в получении блокировки, rollback до commit, сбой синхронного обновления, ошибку асинхронного V1/V2 сценария и повтор запроса после неопределённого сетевого ответа. Сверяйте статус бизнес-объекта, документ и итоговые суммы, а не только возврат управления из вызывающей программы.

Ссылки описывают ABAP Platform и SAP Application Server для указанных выпусков. Детали блокировки и обновления зависят от стека и используемого фреймворка. В этом проекте нет SAP runtime; конкурентные транзакции и Update Task не выполнялись.

Источники и документация

  1. SAP Lock Concept ↗
  2. CALL FUNCTION, IN UPDATE TASK ↗
  3. Synchronous and Asynchronous Updating ↗

Источники нужны для самостоятельной проверки. Примеры и интерпретации на сайте могут быть учебными упрощениями.