Para realizar bloqueos se debe crear un objeto de transacción con la tx. SE11. Se utiliza el prefijo EZ para la nomenclatura (EZ_EJEMPLO). En ella se informa la/las tabla/as que se requiere bloquear y el modo de bloqueo (escritura y/o lectura). El bloqueo se realizará por la clave de la tabla.
Al crear el objeto de bloqueo el sistema genera automáticamente dos módulos de función, uno para desbloquear DEQUEUE_* (con el ejempo DEQUEUE_EZ_EJEMPLO) y otro para bloquear ENQUEUE_* ( con el ejemplo ENQUEUE_EZ_EJEMPLO).
Llamada bloqueo (se actualiza variables del sistema SY-SUBRC).
CALL FUNCTION 'ENQUEUE_EZ_EJEMPLO'
EXPORTING
id = p_id
_scope = 1
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.
Llamada desbloqueo (se actualiza variables del sistema SY-SUBRC):
CALL FUNCTION 'DEQUEUE_EZ_EJEMPLO'
EXPORTING
id = p_id.
IMPORTANTE:
En la llamada al módulo de función ENQUEUE hay un parámetro de entrada _SCOPE que es opcional y por defecto tiene el valor 2. Para garantizar que nuestro programa sea el que desbloque el objeto se debe informar _SCOPE = 1. En caso contrario (_SCOPE =2 ) es el sistema quien decide cuando acaba el bloqueo (en UPDATE TASK).
Más información http://abaplog.wordpress.com/2007/05/02/sap-locks-mistery/