SAP 表的锁和测试

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函数可以检查该函数是否被加锁。

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值