update task锁、连续调用bapi的锁
_SCOPE = '2'
= 1 时在事务结束会解锁。
= 2时call function in update task(执行完)可以解锁(commit触发,非commit解锁)。
= 2 call function in update task可以继承这个锁,所以call function in update task事务结束了会解锁
bapi中加了 _SCOPE = '2'的锁,bapi commit的时候,触发bapi中的update task,update task执行完才会解锁,所以bapi commit执行完锁是还没有解掉的。
使用 local update,update不再提交到update work process完成,会在本work process同步执行,所以执行完commit就解锁完了。
等锁
手动wait
data lt_SEQG3 like table of SEQG3 with header line.
do.
CALL FUNCTION 'ENQUEUE_READ'
EXPORTING
GUNAME = SY-UNAME
TABLES
ENQ = lt_SEQG3.
read table lt_seqg3 into ls_seqg3 with key gname = 'LUBU' garg = lv_garg.
endloop.
if sy-subrc ne 0.
exit.
endif.
enddo.
自动wait(自己session不会wait,只会累计,测试 X 模式也不行)
call function 'ENQUEUE_ELLUBUE'
exporting
mode_vbak = 'E'
mandt = sy-mandt
lgnum = lgnum
ubnum = ubnum
_wait = abap_true
exceptions
foreign_lock = 1
system_failure = 2
others = 3.
不建锁对象加锁
1、锁表的通用函数:
data:
lv_key(255),
lv_rtype type bapi_mtype,
lv_rtmsg type bapi_msg.
lv_key = sy-mandt && gt_alv-vbeln.
perform frm_lock using 'VBAK' lv_key changing lv_rtype lv_rtmsg.
if lv_rtype = 'E'.
message s001(00) with lv_rtmsg display like 'E'.
leave list-processing and return to screen 0.
endif.
form frm_lock using uv_tabname uv_key changing cv_rtype cv_rtmsg.
data ls_rstable like rstable.
ls_rstable-tabname = uv_tabname.
ls_rstable-varkey = uv_key.
call function 'ENQUEUE_E_TABLE'
exporting
tabname = ls_rstable-tabname
varkey = ls_rstable-varkey
exceptions
foreign_lock = 1
system_failure = 2
others = 3.
if sy-subrc ne 0.
cv_rtype = 'E'.
message id sy-msgid
type sy-msgty
number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 into cv_rtmsg.
return.
else.
cv_rtype = 'S'.
endif.
endform.
2、为表解锁的通用函数:
perform frm_unlock using 'AUFK' lv_key.、
form frm_unlock using uv_tabname uv_key.
data ls_rstable like rstable.
ls_rstable-tabname = uv_tabname.
ls_rstable-varkey = uv_key.
call function 'DEQUEUE_E_TABLE'
exporting
mode_rstable = 'E'
tabname = ls_rstable-tabname
varkey = ls_rstable-varkey
x_tabname = ' '
x_varkey = ' '
_scope = '3'
_synchron = ' '
_collect = ' '.
endform.
.
标准锁对象
标准锁对象
SE11,表所用处清单
调用
LOOP AT GT_OUT.
*预留
CALL FUNCTION 'ENQUEUE_EMRESB'
EXPORTING
MODE_RESB = 'E'
MANDT = SY-MANDT
RSNUM = GT_OUT-RSNUM
RSPOS = GT_OUT-RSPOS
* RSART =
* X_RSNUM = ' '
* X_RSPOS = ' '
* X_RSART = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID
TYPE 'S'
NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
LEAVE LIST-PROCESSING.
ENDIF.
ENDLOOP.
注意:如果在锁定时key传入空值,则后面再次加锁时无论传入什么key都会返回sy-subrc = 1,请求的对象被锁定
数据库锁
DB01 点刷新