1.概要
锁对象是在SE11中可以创建/变更/查询的ABAP对象,起着同期化数据的作用。如下图1-1所示,当“程序1”
修改数据时使“程序2”不能访问数据。因为这时的“程序1”给相应数据加了锁。
图1-1
锁运行的机制提供两个主要的功能。
1.当程序读取数据变更后向其他程序传达已经结束的消息。
2.防止程序读取正在被别的程序修改中的数据。
要设置锁的前提是在ABAP数据字典中应该存在此锁对象。当**锁对象时自动生成加锁/解锁用的下列两个函数。
ENQUEUE <LockObjectname>
DEQUEUE <LockObjectname>
如下图1-2所示,给表加锁的步骤
1.要求锁
在程序邀请给数据加锁。
2.进入锁
把需要加锁的数据输入到锁表中。
3.设置锁
当程序要求时才给表加锁。加锁状态会保持到程序中遇到解锁或者程序结束。所有锁都要在程序内部进行加锁,因此应该都要在程序内部进行解锁。当程序访问已经加锁的数据时该邀请信息会存储到锁表中。
4.访问数据
只有在设置了锁的程序中才能访问该数据。
在上图中,给表1创建了锁对象,则自动生成加/解锁此表的函数。
锁定模式的解释:
E-独占锁:只允许一个用户访问表。对其他程序的独占锁及共享锁不起作用。
S-共享锁:多个用户可以同时读取数据。但是,倘若有个用户在修改数据,则其他就无法再访问数据了。
X-独占锁但不是累计锁:独占锁可以在多个不同事务码内申请解锁。但是在相应事务码中只能申请一次,此外不接受其他任何锁申请。
2.创建锁对象
在下面的例子中我用到了两个表“ZEMP”和“ZEMPCERT”,其中"ZEMPCERT"是外键表。
1.在T-CODE:SE11 ABAP字典中创建。(锁对象名字一定要以E开头)
记得勾选“允许RFC”,则可以从其他系统中调用
2.点击 表格 标签页,在名称中输入需要加锁的表名。单击 添加剂可以追加锁对象需要的表。单击‘添加’则弹出由外部键相连的表list.
3.选择需要加锁的参数。
创建锁对象后**,则自动生成下列两个函数。当删除锁对象时也会被一起删除。
EZQUEUE_ZEMP
UNQUEUE_ZEMP
3.锁程序实例
1.创建程序后单击Pattern按钮,然后输入所创建的锁函数,会自动生成代码。
代码示例
REPORT zhzytest005 MESSAGE-ID zpp.
CALL FUNCTION 'ENQUEUE_EZ_ZEMP'
EXPORTING
mode_zemp = 'E'
mode_zempcert = 'E'
mandt = sy-mandt
emp_no = '01'
* =
x_emp_no = 'X'
* x_certid = ' '
* _scope = '2'
* _wait = ' '
* _collect = ' '
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.
MESSAGE s689 WITH 'data is locked'.
STOP.
ENDIF.
WRITE 'haha'.
可以尝试一下效果,先在本程序运行,然后不要关闭,再重新打开一个窗口,再运行本程序,会发现弹出提示‘data is locked’
4.锁的参数属性
1.initial value 参数
以‘X_<field>’开始的参数会设置字段的初始值。若设置成X_EMP_NO = 'X',则当遇到与EMP_NO的初始值相同值才会设置锁对象。EMP_NO的初始值只需要在表字段中选择INITIAL VALUE选项。当没有设置X时,则会用Default Value指定初始值。在上图中,X_EMP_NO被设置为Default Value = SPACE。这意味着参数EMP-NO中没有指定值时会被当成SPACE来设置锁对象。
2.Passing Lock参数
正在运行的锁是当调用解锁函数DEQUEUE或者程序结束时才被解除。遇到信息类型A和X时或用户在命令窗口中输入了“/n”时也被解除。但,当事务码正在执行UPDATE时结果不一样了,这种情况检查_SCORE判断是否可以解除锁。
_SCOPR = 1: 在UPDATE程序中无法连接锁。当结束事务码时锁也一起结束。
_SCOPE = 2:在UPDATE程序中可以连接锁。在UPDATE程序中负责解锁。
_SCOPE = 3:UPDATE程序可以连接锁。调用程序与UPDATE程序通过相互交互进行解锁。
3.控制锁参数
_COLLECT参数决定是直接执行加/解锁还是通过Lock Container执行。
initial value:加/解锁请求信息直接发送到锁服务器上。
X:加/解锁请求首先会存储到本地Lock Container中。
其他
CALL FUNCTION 'ENQUEUE_READ'
* EXPORTING
* GCLIENT = SY-MANDT
* GNAME = ' '
* GARG = ' '
* GUNAME = SY-UNAME
* LOCAL = ' '
* IMPORTING
* NUMBER =
* SUBRC =
TABLES
enq =
* EXCEPTIONS
* COMMUNICATION_FAILURE = 1
* SYSTEM_FAILURE = 2
* OTHERS = 3
ENQUEUE_READ函数
如多个用户同时修改一个订单,在SAP系统中经常会发生修改同一个数据的情况。
所以可以利用ENQUEUE_READ函数可以检查该函数是否被加锁。
程序中锁对象运行后,可以在SM12事物代码下查看那被锁定对象的查看。也可以通过SM12删除锁。
以上。
作者:熙來攘往
来源:CSDN
原文:https://blog.csdn.net/HJackyua/article/details/73613327
版权声明:本文为博主原创文章,转载请附上博文链接!