【转载】SAP ABAP LOCK 锁对象 数据库锁

时间:2024-04-07 17:29:06

1.概要

锁对象是在SE11中可以创建/变更/查询的ABAP对象,起着同期化数据的作用。如下图1-1所示,当“程序1”
修改数据时使“程序2”不能访问数据。因为这时的“程序1”给相应数据加了锁。  【转载】SAP ABAP LOCK 锁对象 数据库锁                                                                        

                                                                                       图1-1

锁运行的机制提供两个主要的功能。

1.当程序读取数据变更后向其他程序传达已经结束的消息。
2.防止程序读取正在被别的程序修改中的数据。
要设置锁的前提是在ABAP数据字典中应该存在此锁对象。当**锁对象时自动生成加锁/解锁用的下列两个函数。

      ENQUEUE <LockObjectname>
      DEQUEUE <LockObjectname>
如下图1-2所示,给表加锁的步骤
      1.要求锁

   在程序邀请给数据加锁。

      2.进入锁

   把需要加锁的数据输入到锁表中。

      3.设置锁

   当程序要求时才给表加锁。加锁状态会保持到程序中遇到解锁或者程序结束。所有锁都要在程序内部进行加锁,因此应该都要在程序内部进行解锁。当程序访问已经加锁的数据时该邀请信息会存储到锁表中。

【转载】SAP ABAP LOCK 锁对象 数据库锁
    4.访问数据

【转载】SAP ABAP LOCK 锁对象 数据库锁
只有在设置了锁的程序中才能访问该数据。
在上图中,给表1创建了锁对象,则自动生成加/解锁此表的函数。
锁定模式的解释:
E-独占锁:只允许一个用户访问表。对其他程序的独占锁及共享锁不起作用。
S-共享锁:多个用户可以同时读取数据。但是,倘若有个用户在修改数据,则其他就无法再访问数据了。
X-独占锁但不是累计锁:独占锁可以在多个不同事务码内申请解锁。但是在相应事务码中只能申请一次,此外不接受其他任何锁申请。
2.创建锁对象
在下面的例子中我用到了两个表“ZEMP”和“ZEMPCERT”,其中"ZEMPCERT"是外键表。

1.在T-CODE:SE11 ABAP字典中创建。(锁对象名字一定要以E开头)
   记得勾选“允许RFC”,则可以从其他系统中调用

【转载】SAP ABAP LOCK 锁对象 数据库锁
2.点击 表格  标签页,在名称中输入需要加锁的表名。单击  添加剂可以追加锁对象需要的表。单击‘添加’则弹出由外部键相连的表list.

【转载】SAP ABAP LOCK 锁对象 数据库锁

3.选择需要加锁的参数。

【转载】SAP ABAP LOCK 锁对象 数据库锁

创建锁对象后**,则自动生成下列两个函数。当删除锁对象时也会被一起删除。
                                                   EZQUEUE_ZEMP
                                                   UNQUEUE_ZEMP
   3.锁程序实例
1.创建程序后单击Pattern按钮,然后输入所创建的锁函数,会自动生成代码。

【转载】SAP ABAP LOCK 锁对象 数据库锁

代码示例
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.锁的参数属性

【转载】SAP ABAP LOCK 锁对象 数据库锁

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

【转载】SAP ABAP LOCK 锁对象 数据库锁

 

程序中锁对象运行后,可以在SM12事物代码下查看那被锁定对象的查看。也可以通过SM12删除锁。

【转载】SAP ABAP LOCK 锁对象 数据库锁

以上。


作者:熙來攘往 
来源:CSDN 
原文:https://blog.csdn.net/HJackyua/article/details/73613327 
版权声明:本文为博主原创文章,转载请附上博文链接!