一、创建锁对象
1.在事务码se11中输入锁对象名称,点击创建按钮。锁对象名字一定要以E开头,后面追加Z或Y,再追加其他内容,名字长度不能超过16。
2.输入对象描述便于查找,勾选RFC选项,则可其他系统调用。
3.在表格标签页输入表名称和锁模式,若要关联其他表可点击添加,填写其他表名称和锁模式。
- E-独占锁:只允许一个用户访问表,对其他程序的独占锁及共享锁不起作用。
- S-共享锁:多个用户可以同时读取数据,但是,若有个用户在修改数据,则其他用户就无法再访问数据,此外对其他用户使用的共享锁起作用,但是对独占锁是不起作用的。
- X-独占锁但不是累计锁:独占锁可以再多个不同的事务码内申请锁。但是在相应事务码中只能申请一次,此外不接收其他任何锁申请。
4.在锁参数标签页,默认显示表的主键,这些参数最终构成函数的参数。
5.保存激活后则自动生成以下两个函数,当锁对象删除时这两函数也会一起删除。
- ENQUEUE_ETRAIN01
- DEQUEUE_ETRAIN01
5.1函数参数
- 表字段
- _WAIT
功能:控制当锁尝试由于冲突锁而失败时的行为。如果设置为’X’或特定的等待时间,系统会在一定时间后重试锁定操作,而不是立即返回失败。
定义:该参数决定了锁冲突时的行为,是否等待锁变为可用。其默认值为’ '(空格),表示不等待,立即返回锁定失败的结果 - _SCOPE
功能:控制锁或锁释放的行为,特别是在事务更新或调用更新子程序时的处理方式。
定义:有三个主要值:1(锁和锁释放不传递给更新程序)、2(锁或锁释放传递给更新程序,更新程序负责移除锁)、3(锁必须从交互式程序和更新程序中同时移除)。 - MODE_
功能:定义锁对象中的每个基础表(tab)的锁模式。
定义:锁模式可以是S(共享锁,允许多个用户同时读取但不允许写入)、E(独占锁,只允许一个用户读取或写入)、X(独占锁但不是累计锁,类似于E但具有特定的行为差异)。 - _COLLECT
功能:控制锁请求或锁释放是直接执行还是应该先被写入本地锁容器。
定义:如果设置为’X’,锁请求或锁释放会被放在本地锁容器中,之后可以通过调用FLUSH_ENQUEUE函数模块成组地发送给锁服务器。如果未设置或设置为其他值,锁请求或锁释放将直接发送给锁服务器。
5.2代码调用
CALL FUNCTION 'ENQUEUE_ETRAIN01'
EXPORTING
MODE_TRDIR = 'E'
MANDT = SY-MANDT
CARRID = 'AA'
X_CARRID = ' '
...
_SCOPE = '2'
_WAIT = ' '
_COLLECT = ' '
CALL FUNCTION 'DEQUEUE_ETRAIN01'
EXPORTING
MODE_TRDIR = 'E'
MANDT = SY-MANDT
CARRID = 'AA'
X_CARRID = ' '
...
_SCOPE = '3'
_WAIT = ' '
_COLLECT = ' '
CALL FUNCTION 'DEQUEUE_ALL' "清除所有锁
EXPORTING
_SYNCHRON = ''
CALL FUNCTION 'ENQUEUE_E_TABLE' "锁整个表
EXPORTING
MODE_TRDIR = 'E'
TABNAME = 'SFLIGHT'.
CALL FUNCTION 'DEQUEUE_E_TABLE'
EXPORTING
MODE_TRDIR = 'E'
TABNAME = 'SFLIGHT'.
锁机制的目的不在于阻止DML语句,而是在于同期化数据。即使已经设置了锁,也可以直接执行SQL语句来更新数据。
二、ENQUEUE_READ 函数
ENQUEUE_READ函数返回被加锁的表数据列表。
CALL FUNCTION 'ENQUEUE_READ'
EXPORTING
GCLIENT = SY-MANDT
* GNAME = ''
* GUNAME = SY-UNAME
* LOCAL = ''
* IMPORTING
* NUMBER =
* SUBRC =
TABLES
enq = itab.