在SAP中使用锁对象,用于避免在数据库中插入或更改数据时出现不一致的情况
1.创建锁对象
数据准备
使用事务码SE11创建锁对象
点击"锁对象"单选按钮,输入以E开头的锁定对象的名称,然后点击创建按钮
锁对象名称一定要以E开头,后面追加Z或Y,再追加其他内容,名称长度不能超过16
输入简短描述,点击表选项卡,在名称字段中输入表名称,并选择锁模式
锁模式
点击锁参数选项卡,将出现以下屏幕
在锁参数标签页,默认显示表的主键,这些参数最终构成函数的参数
保存并激活后则自动生成以下2个函数,当锁对象删除时这2个函数也会一起删除
提示Tips在SE11界面中,通过菜单 【转到】|【锁模块】可以查看到函数名锁对象激活后,会在系统中自动产生2个函数,分别用于表对象的锁定以及表对象的释放① 创建锁定的函数的命名规则为:ENQUEUE_+ 锁对象名② 释放锁定的函数的命名规则为:DEQUEUE_+ 锁对象名
2.在程序中使用锁对象
加锁解锁测试
加锁期间,事务码 SM12可以对锁对象进行查看和删除
编写一段代码,对学校表(ZDBT_SCH_437)加锁,一分钟后释放:
REPORT z437_test_2024.CALL FUNCTION 'ENQUEUE_EZ_SCH_437'EXPORTINGmode_zdbt_sch_437 = 'E'mandt = sy-mandt_scope = '2'EXCEPTIONSforeign_lock = 1system_failure = 2OTHERS = 3.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.WRITE / 'Table ZDBT_SCH_437 Was Locked.'.WAIT UP TO 60 SECONDS.CALL FUNCTION 'DEQUEUE_EZ_SCH_437'EXPORTINGmode_zdbt_sch_437 = 'E'mandt = sy-mandt.WRITE / 'Table ZDBT_SCH_437 Was Unlocked.'.
ENDIF.
运行期间,SM12查看锁对象:
程序运行结束后 ,刷新SM12 ,可以看到锁已经释放
编写一段代码对学校表(ZDBT_SCH_437)进行修改
REPORT z437_test_2024.DATA: gt_school TYPE STANDARD TABLE OF zdbt_sch_437 WITH HEADER LINE.SELECT * FROM zdbt_sch_437 INTO TABLE gt_school.CALL FUNCTION 'ENQUEUE_EZ_SCH_437'EXPORTINGmode_zdbt_sch_437 = 'E'mandt = sy-mandt_scope = '2'EXCEPTIONSforeign_lock = 1system_failure = 2OTHERS = 3.IF sy-subrc IS INITIAL.MODIFY zdbt_sch_437 FROM TABLE gt_school.CALL FUNCTION 'DEQUEUE_EZ_SCH_437'EXPORTINGmode_zdbt_sch_437 = 'E'mandt = sy-mandt.WRITE / 'Data Was Saved Successfully'.ELSE.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
上锁的一般步骤
先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁
按照这个步骤,才能保证更改完全运行在锁的保护机制下