sap abap 锁对象 数据库锁

.概要

锁对象是在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_’开始的参数会设置字段的初始值。若设置成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参数

猜你喜欢

转载自blog.csdn.net/weixin_42921800/article/details/81669792
今日推荐