一、作用
在系统中修改数据时锁对象可以防止数据不一致现象发生。
二、锁对象
创建锁
- 在T-CODE:SE11 ABAP数据字典中输入锁对象,锁对象的名字一定要以E开头,后面追加Z或Y即指定以EZ或者EY开头的16位以内的名字
- 输入有助于查询的描述,选择Allow RFC选项,则可以从其他系统调用。
- 选择表标签页,输入主表名称,选择锁模式
锁模式的解释
独占锁(X) 锁定的数据仅可由一个用户进行显示或编辑。对另一独占锁或共享锁的请求均将遭到拒绝。
共享锁(S) 多个用户可同时读取访问相同的数据。然而,一旦任何一个用户在处理数据,第二个用户就不能再访问此数据。接受对其它共享锁的请求,即使这些共享锁来自不同的用户。拒绝对独占锁的请求。
独占但不累计锁(E) 鉴于独占锁可由相同的事务请求多次并逐个释放,因此独占非累计锁只能由相同的事务请求一次。所有的其它锁请求都将被拒绝。
乐观锁 (O): 乐观锁最初表现为与共享锁相似,可转换成独占锁。
促进乐观锁 ®: 将乐观锁转换成独占锁。
冲突检查/促进检查 (‘U’, ‘V’, ‘W’, ‘C’) 检查相应锁 (‘E’, ‘S’, ‘X’, ‘O’) 之一是否可能,但不设置锁
- 选择锁参数标签页 则默认显示表的主键,这些参数将成为函数的参数,相应的参数的组合最后要确保数据的唯一性,因此一般锁对象参数使用相应表的主键
5、创建锁对象后激活 当激活锁对象时自动生成加锁/解锁用的两个函数 ENQUEUE_锁对象:加锁函数 DEQUEUE_锁对象:解锁函数
三、锁函数
- Initial Value 以’X_'开始的参数会设置字段的初始值。若设置成X_=‘X’,则当遇到与EMP_NO的初始值相同值才会设置锁对象
- passing Lock
正在运行的锁是在碰到解锁函数DEQUEUE或者是程序结束才释放,还是碰到隐式( A类信息,跳转画面 )或显示提交( commit work )就会释放,
_SCOPR = 1 表示前一种,2/3表示后一种,
在update function中还会有不同的情况:
- _SCOPR = 1: 在UPDATE程序中无法连接锁。当结束事务码时锁也一起结束。
- _SCOPE = 2:在UPDATE程序中可以连接锁。在UPDATE程序中负责解锁。
- _SCOPE = 3:UPDATE程序可以连接锁。调用程序与UPDATE程序通过相互交互进行解锁。
- _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 | 返回被加锁对象的详细信息 |