锁对象学习

2021-11-09 18:28:37 浏览数 (1)

一、作用

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

二、锁对象

创建锁

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

锁模式的解释

独占锁(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中。

函数实例

代码语言:javascript复制
* 加锁
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函数的参数详解

参数

描述

GCLINET

Client名

GNAME

对象名。表名,程序名

GARG

返回各表的关键字,例如生产订单返回600000010020878值。意味着600是Client,000010020878是生产订单

GUNAME

返回SY-UNAME

LOCAL

不使用

NUMBER

Lock件数

SUBRC

返回系统变量SY-SUBRC

ENG

返回被加锁对象的详细信息

0 人点赞