锁对象学习

一、作用

在系统中修改数据时锁对象可以防止数据不一致现象发生。

二、锁对象

创建锁

  1. 在T-CODE:SE11 ABAP数据字典中输入锁对象,锁对象的名字一定要以E开头,后面追加Z或Y即指定以EZ或者EY开头的16位以内的名字在这里插入图片描述
  2. 输入有助于查询的描述,选择Allow RFC选项,则可以从其他系统调用。
    在这里插入图片描述
  3. 选择表标签页,输入主表名称,选择锁模式
    在这里插入图片描述
    锁模式的解释

独占锁(X)
锁定的数据仅可由一个用户进行显示或编辑。对另一独占锁或共享锁的请求均将遭到拒绝。

共享锁(S)
多个用户可同时读取访问相同的数据。然而,一旦任何一个用户在处理数据,第二个用户就不能再访问此数据。接受对其它共享锁的请求,即使这些共享锁来自不同的用户。拒绝对独占锁的请求。

独占但不累计锁(E)
鉴于独占锁可由相同的事务请求多次并逐个释放,因此独占非累计锁只能由相同的事务请求一次。所有的其它锁请求都将被拒绝。

乐观锁 (O):
乐观锁最初表现为与共享锁相似,可转换成独占锁。

促进乐观锁 ®:
将乐观锁转换成独占锁。

冲突检查/促进检查 (‘U’, ‘V’, ‘W’, ‘C’)
检查相应锁 (‘E’, ‘S’, ‘X’, ‘O’) 之一是否可能,但不设置锁

  1. 选择锁参数标签页
    则默认显示表的主键,这些参数将成为函数的参数,相应的参数的组合最后要确保数据的唯一性,因此一般锁对象参数使用相应表的主键
    在这里插入图片描述
    5、创建锁对象后激活
    当激活锁对象时自动生成加锁/解锁用的两个函数
    ENQUEUE_锁对象:加锁函数
    DEQUEUE_锁对象:解锁函数

三、锁函数

在这里插入图片描述

  1. Initial Value
    以’X_'开始的参数会设置字段的初始值。若设置成X_=‘X’,则当遇到与EMP_NO的初始值相同值才会设置锁对象
  2. passing Lock
    正在运行的锁是在碰到解锁函数DEQUEUE或者是程序结束才释放,还是碰到隐式( A类信息,跳转画面 )或显示提交( commit work )就会释放,
    _SCOPR = 1 表示前一种,2/3表示后一种,
    在update function中还会有不同的情况:
    • _SCOPR = 1: 在UPDATE程序中无法连接锁。当结束事务码时锁也一起结束。
    • _SCOPE = 2:在UPDATE程序中可以连接锁。在UPDATE程序中负责解锁。
    • _SCOPE = 3:UPDATE程序可以连接锁。调用程序与UPDATE程序通过相互交互进行解锁。
  3. _COLLECT参数
    _COLLECT参数决定是直接执行加/解锁还是通过Lock Container执行。
    - initial value:加/解锁请求信息直接发送到锁服务器上
    - X:加/解锁清秋首先会存储在本地Lock Container中。

函数实例

* 加锁
CALL FUNCTION 'ENQUEUE_EZ_ZEMP'
  EXPORTING
    MODE_ZPEIXUN   = 'E'
    MANDT          = SY-MANDT
    ZSCHOOL        = '101'
   _SCOPE         = '2'
  EXCEPTIONS
    FOREIGN_LOCK   = 1
    SYSTEM_FAILURE = 2
    OTHERS         = 3.
IF SY-SUBRC EQ 0.
  WRITE '数据加锁'.
ENDIF.

* 解锁
CALL FUNCTION 'DEQUEUE_EZ_ZEMP'
  EXPORTING
    MODE_ZPEIXUN = 'E'
    MANDT        = SY-MANDT
    ZSCHOOL      = '101'
    _SCOPE       = '3'.

IF SY-SUBRC EQ 0.
  WRITE '数据解锁'.
ENDIF.

* 一次性释放多个锁对象
CALL FUNCTION 'DEQUEUE_ALL'
* EXPORTING
*   _SYNCHRON       = ' '
  .

四、锁表

为了完成表更新,需要为整个表进行加锁,可以使用ENQUEUE_E_TABLE/DEQUEUE_E_TABLES进行对整个表的加锁和解锁。
即使使用此函数也无法阻止程序内用UPDATE、MODIFY等语句更新数据。只是如禁止通过数据浏览器变更表数据操作。

五、ENQUEUE_READ函数

多个用户同时修改一个订单,在SAP系统中经常会发生修改同一个数据的情况。在开发程序中利用ENQUEUE_READ函数可以检查该数据是否被加锁。标准程序修改数据时始终会加锁,因此要习惯用ENQUEUE_READ函数对锁设置状态进行检查。

ENQUEUE_READ函数的参数详解

参数描述
GCLINETClient名
GNAME对象名。表名,程序名
GARG返回各表的关键字,例如生产订单返回600000010020878值。意味着600是Client,000010020878是生产订单
GUNAME返回SY-UNAME
LOCAL不使用
NUMBERLock件数
SUBRC返回系统变量SY-SUBRC
ENG返回被加锁对象的详细信息
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值