在系统中修改数据时锁对象可以防止数据不一致现象发生。
锁模式的解释
独占锁(X) 锁定的数据仅可由一个用户进行显示或编辑。对另一独占锁或共享锁的请求均将遭到拒绝。
共享锁(S) 多个用户可同时读取访问相同的数据。然而,一旦任何一个用户在处理数据,第二个用户就不能再访问此数据。接受对其它共享锁的请求,即使这些共享锁来自不同的用户。拒绝对独占锁的请求。
独占但不累计锁(E) 鉴于独占锁可由相同的事务请求多次并逐个释放,因此独占非累计锁只能由相同的事务请求一次。所有的其它锁请求都将被拒绝。
乐观锁 (O): 乐观锁最初表现为与共享锁相似,可转换成独占锁。
促进乐观锁 ®: 将乐观锁转换成独占锁。
冲突检查/促进检查 (‘U’, ‘V’, ‘W’, ‘C’) 检查相应锁 (‘E’, ‘S’, ‘X’, ‘O’) 之一是否可能,但不设置锁
5、创建锁对象后激活 当激活锁对象时自动生成加锁/解锁用的两个函数 ENQUEUE_锁对象:加锁函数 DEQUEUE_锁对象:解锁函数
函数实例
* 加锁
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等语句更新数据。只是如禁止通过数据浏览器变更表数据操作。
多个用户同时修改一个订单,在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 | 返回被加锁对象的详细信息 |