前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >锁对象学习

锁对象学习

作者头像
秋白
发布2021-11-09 18:28:37
6600
发布2021-11-09 18:28:37
举报
文章被收录于专栏:java小白java小白

一、作用

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

二、锁对象

创建锁

  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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、作用
  • 二、锁对象
    • 创建锁
    • 三、锁函数
    • 四、锁表
    • 五、ENQUEUE_READ函数
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档