Optimistic Locks - kazumov/abap GitHub Wiki

https://github.com/kazumov/abap/blob/master/examples/optimistic-locks.abap

REPORT DEMO_OPT_ENQUEUE.
DATA: lock_mode_opt type enqmode value 'O'.
DATA: lock_mode_excl type enqmode value 'E'.
DATA: lock_mode_opt_to_excl type enqmode value 'R'.

Set optimistic lock. The operation is successful when there is no collision with foreign 'E' and 'X' locks.

CALL FUNCTION 'ENQUEUE_ENQ_SFLIGHT'
EXPORTING
MODE_SFLIGHT = lock_mode_opt
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

Promote optimistic lock into an exclusive lock. The operation is successful, if:

  • the own 'O' lock still exists;
  • there is no collision of the new 'E' lock with foreign locks.
CALL FUNCTION 'ENQUEUE_ENQ_SFLIGHT'
EXPORTING
MODE_SFLIGHT = lock_mode_opt_to_excl
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

Release exclusive lock

CALL FUNCTION 'DEQUEUE_ENQ_SFLIGHT'
EXPORTING
MODE_SFLIGHT = lock_mode_excl.