Ну у меня сложилось впечатление, что различия заключаются в следующем:
E (Exclusive) - Скажем так, у меня программа в рамках одной транзакции имеет два модуля, который могут вызваться как последовательно так и по отдельности. Пусть они обрабатывают изменение документа. Так вот чтобы не заморачиваться, я в каждом из модулей первой командой вызываю блокирование документа, при этом при последовательном вызове этих модулей в рамках одной транзакции, когда второй модуль запросит блокирование этого же документа ему будет возвращен sy-subrc = 0, т.е. типа блокирование прошло успешно, т.е.такая блокировка защищает объект от блокирования другими транзакциями и другими пользователями, но в рамках одной транзакции я могу в разных местах вызывать блокировку одного и того же объекта и если объект при первом вызове блокирован успешно, то все повторные вызовы будут успешными.
X (eXclusive non-cumulative) - Этот метод более ответственно требует относится к блокированию. Если рассматривать первый пример, то при последовательном вызове второго модуля, в рамках одной транзакции я получу ошибку блокирования объекта и как результат завершение работы модуля 2.
Для примера в поставьте два вызова подряд, в одной программе, блокирования одного и того же объекта. По режиму E (Exclusive) и по X (eXclusive non-cumulative), в первом случае, второй вызов блокирования объекта будет успешным, во втором случае вам будет возвращена ошибка блокирования.
Теперь когда что использовать. Ну скажем так тут многое завязано на логику работы приложения в целом, например если это два функциональных модуля, каждый из которых вызывается для изменения документа, при этом модули могут в вашей программе вызваться как последовательно так и по отдельности, то я бы использовал блокировку типа X, так как при блокировке типа E, хорошо если вы во второй модуль, передадите все измененные данные из первого модуля, а если это разные поля, но при этом для простоты обработки вы обновляете всю запись целиком в виде MODIFY <запись таблицы с ключами>, то изменения из второго модуля перезапишут изменения первого. Если же поля разные и обновляются точечно в виде UPDATE <> SET <поле> = <значение> WHERE <ключ>, то можно использовать блокировку типа E.
PS: Ну как-то типа так, если не прав исправляете...