锁对象的使用
创建锁对象以及对锁的使用
ABAP锁、数据库锁
锁定模式的解释:
E-独占锁:只允许一个用户访问表。对其他程序的独占锁及共享锁不起作用。
S-共享锁:多个用户可以同时读取数据。但是,倘若有个用户在修改数据,则其他就无法再访问数据了。
X-独占锁但不是累计锁:独占锁可以在多个不同事务码内申请解锁。但是在相应事务码中只能申请一次,此外不接受其他任何锁申请。
加锁:
*&---------------------------------------------------------------------*
*& FORM GET_ALV_DATA
*&---------------------------------------------------------------------*
* 获取数据
*----------------------------------------------------------------------*
* -->
* -->
*----------------------------------------------------------------------*
FORM get_alv_data TABLES p_gt_alv_output STRUCTURE gw_alv_output.
DATA lv_serial TYPE zppt002b-zserial.
"对流水号对象上锁 "锁表内容,而不是整个表
CALL FUNCTION 'ENQUEUE_EZZPPT002B1' "加锁
EXPORTING
* MODE_ZPPT002B = 'E'
* client = sy-mandt
ztype = p_type "选择屏幕条件
* X_PART_NO = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
"如果加锁成功
IF sy-subrc = 0.
"查询自建表数据
SELECT
zserial
FROM zppt002b
INTO @lv_serial
WHERE
ztype = @p_type
AND zserial GE @sy-datum+0(6)
ORDER BY zserial DESCENDING
.
EXIT.
ENDSELECT.
IF sy-subrc <> 0.
"如果自建表没有数据,则设置序列号
CONCATENATE sy-datum+0(6) '0001' INTO lv_serial.
ELSE.
"如果自建表有数据
lv_serial = lv_serial + 1.
ENDIF.
"给ALV内表设置值
DO p_quan TIMES.
CLEAR gw_alv_output.
gw_alv_output-type = p_type.
gw_alv_output-serial = lv_serial.
APPEND gw_alv_output TO p_gt_alv_output.
lv_serial = lv_serial + 1.
ENDDO.
ENDIF.
ENDFORM.
解锁:
*&---------------------------------------------------------------------*
*& Form SAVE_SERIAL
*&---------------------------------------------------------------------*
*& 打印成功后把相应的序列号保存到表中
*&---------------------------------------------------------------------*
*& --> LT_ALV_OUTPUT
*&---------------------------------------------------------------------*
FORM save_serial TABLES p_gt_sf_output STRUCTURE gw_sf_output.
MODIFY zppt002b FROM TABLE p_gt_sf_output.
IF sy-subrc = 0.
CALL FUNCTION 'DEQUEUE_EZZPPT002B1' "解锁
EXPORTING
* MODE_ZPPT002B = 'E'
* CLIENT = SY-MANDT
ztype = p_type
* X_PART_NO = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
.
ENDIF.
ENDFORM.