sap abap 锁对象 数据库锁

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
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值